# all figure sizes and coordinates are in inches
figw = 16
figh = 12
fig_edge = 0.02
subplot_vertices_y = np.linspace(fig_edge, figh - fig_edge, 7)
subplot_h = subplot_vertices_y[-1] - subplot_vertices_y[0]
subplot_vertices_x = np.linspace((figw - subplot_h) / 2, (figw + subplot_h) / 2, 7)
subplot_vertices_y /= figh
subplot_vertices_x /= figw
# subplot_vertices_xx, subplot_vertices_yy = np.meshgrid(subplot_vertices_x, subplot_vertices_y)
fig, axs = plt.subplots(6, 6, figsize=(figw, figh))
fig.subplots_adjust(wspace=0, hspace=0,
left=subplot_vertices_x[0],
right=subplot_vertices_x[-1],
bottom=subplot_vertices_y[0],
top=subplot_vertices_y[-1])
gs = axs[0, 2].get_gridspec()
# remove the underlying Axes
for ax in axs[0, 2:4]:
ax.remove()
axbig1 = fig.add_subplot(gs[0, 2:4])
axs[0, 2] = axbig1
axs[0, 3] = np.nan
gs = axs[2, 2].get_gridspec()
# remove the underlying Axes
for ax in axs[2:4, 2]:
ax.remove()
axbig2 = fig.add_subplot(gs[2:4, 2])
axs[2, 2] = axbig2
axs[3, 2] = np.nan
axs_flatten = axs.flatten()
axs_flatten = np.delete(axs_flatten, [3, 20])
# Remove ticks and tick labels from all subplots
for ax in axs_flatten:
ax.set_xticks([])
ax.set_yticks([])
ax.set_xticklabels([])
ax.set_yticklabels([])
# set light gray background
# ax.patch.set_facecolor('0.8')
# dh_type1_cm = cm.lapaz
# dh_type1_cm.set_bad('k')
dh_im = [None for i in vis_tif_list]
for idx, (water_dh_path, selected_cm, selected_clim, extll, extsize) in enumerate(zip(vis_tif_list, cmap_list, clim_list, extent_ll_list, extent_size_list)):
water_dhraster = rasterio.open(water_dh_path)
water_dh = water_dhraster.read(1)
water_dh[water_dh < -9998] = np.nan
left, bottom, right, top = water_dhraster.bounds
img_extent = (left, right, bottom, top)
# print(img_extent)
dh_im[idx] = axs_flatten[idx].imshow(water_dh, cmap=selected_cm, clim=selected_clim, extent=img_extent)
# dh_im = axs_flatten[idx].imshow(water_dh, cmap=selected_cm, clim=selected_clim)
# dh_im = axs_flatten[idx].imshow(water_dh, cmap=dh_type1_cm, clim=(-90, 0))
if idx in [14, 15, 16, 32, 33]:
gdf_rgi_ACS.plot(ax=axs_flatten[idx], facecolor='none', edgecolor='xkcd:black', linewidth=1)
gdf_rgi_ACS_invert.plot(ax=axs_flatten[idx], facecolor='0.3', edgecolor='none', alpha=0.8)
else:
gdf_rgi_ACN.plot(ax=axs_flatten[idx], facecolor='none', edgecolor='xkcd:black', linewidth=1)
gdf_rgi_ACN_invert.plot(ax=axs_flatten[idx], facecolor='0.3', edgecolor='none', alpha=0.8)
# axs_flatten[idx].set_ylim(bottom-1500, top+1500)
if idx == 2:
axs_flatten[idx].set_xlim(left + extll[0]*15, left + (extll[0]+2.01*extsize) * 15)
axs_flatten[idx].set_ylim(top - extll[1]*15, top - (extll[1]-extsize) * 15)
elif idx == 13:
axs_flatten[idx].set_xlim(left + extll[0]*15, left + (extll[0]+extsize) * 15)
axs_flatten[idx].set_ylim(top - extll[1]*15, top - (extll[1]-2*extsize) * 15)
else:
axs_flatten[idx].set_xlim(left + extll[0]*15, left + (extll[0]+extsize) * 15)
axs_flatten[idx].set_ylim(top - extll[1]*15, top - (extll[1]-extsize) * 15)
# bbox_props = dict(xy=(0, 0.9), width=0.1, height=0.1)
boxstyle = BoxStyle("Square", pad=0.24)
props = {'boxstyle': boxstyle,
'facecolor': 'w',
'linewidth': 1.5,
'edgecolor': 'k'}
if idx == 2:
lbl_x = 0.015
lbl_y = 0.97
elif idx == 13:
lbl_x = 0.03
lbl_y = 0.985
else:
lbl_x = 0.03
lbl_y = 0.97
lbl_txt = str(idx + 1)
if idx in [1, 12]:
lbl_txt += "$^{*}$"
elif idx in [4, 6, 24, 30, 31]:
lbl_txt += "$^{†}$"
axs_flatten[idx].text(lbl_x, lbl_y, lbl_txt, ha='left', va='top', bbox=props, # backgroundcolor='w',
fontsize=18,
transform=axs_flatten[idx].transAxes)
if idx == 2:
scb_x = 0.05
scb_y = 0.1
elif idx == 13:
scb_x = 0.1
scb_y = 0.05
else:
scb_x = 0.1
scb_y = 0.1
scalebar_width = 1000 / (extsize * 15)
axs_flatten[idx].plot([scb_x, scb_x + scalebar_width], [scb_y, scb_y], color='k', linewidth=4,
transform=axs_flatten[idx].transAxes)
# ==== Add lake 3 and lake 4 labels
lake3_ax = axs_flatten[2]
lake3_ax.text(0.32, 0.2, '3-a', fontsize=16, ha='left', va='top', transform=lake3_ax.transAxes)
lake3_ax.text(0.1, 0.6, '3-b', fontsize=16, ha='left', va='top', transform=lake3_ax.transAxes)
lake3_ax.text(0.5, 0.4, '3-c', fontsize=16, ha='left', va='top', transform=lake3_ax.transAxes)
lake4_ax = axs_flatten[3]
lake4_ax.text(0.2, 0.3, '4-a', fontsize=16, ha='left', va='top', transform=lake4_ax.transAxes)
lake4_ax.text(0.57, 0.78, '4-b', fontsize=16, ha='left', va='top', transform=lake4_ax.transAxes)
# ==== Add colorbars
cbax1 = fig.add_axes([0.89, 0.76, 0.017, 0.2])
cb1 = plt.colorbar(dh_im[0], cax=cbax1)
cb1.set_label('dH during an \nactive drainage (m)', size=16)
ticks_pos = [-100, -50, 0]
cbax1.set_yticks(ticks_pos, labels=[str(i) for i in ticks_pos])
cbax2 = fig.add_axes([0.89, 0.46, 0.017, 0.2])
cb2 = plt.colorbar(dh_im[1], cax=cbax2)
# cb2.set_label('dH during an \nactive recharge (m) \n(for [2] & [13])', size=16)
cb2.set_label('dH during an \nactive recharge (m)', size=16)
cbax3 = fig.add_axes([0.89, 0.13, 0.017, 0.2])
cb3 = plt.colorbar(dh_im[4], cax=cbax3)
# cb3.set_label('dH/dt \n(m yr$^{-1}$)\n (for [5], [7], [25], [31], & [32])', size=16)
cb3.set_label('dH/dt \n(m yr$^{-1}$)', size=16)
for ax in [cbax1, cbax2, cbax3]:
ax.tick_params(labelsize=18)
# ==== Red boundary lines ====
boundary_properties = {'linewidth': 4, 'color': 'xkcd:dark red'}
svx = subplot_vertices_x # alias
svy = subplot_vertices_y # alias
starting_x = 0.01
bd1_x, bd1_y = np.array([[starting_x, svx[6], svx[6], svx[3], svx[3], starting_x, starting_x],
[svy[6], svy[6], svy[5], svy[5], svy[4], svy[4], svy[6]]])
bd2_x, bd2_y = np.array([[starting_x, starting_x, svx[3], svx[3], svx[6], svx[6]],
[svy[4], svy[2], svy[2], svy[3], svy[3], svy[5]]])
bd3_x, bd3_y = np.array([[starting_x, starting_x, svx[6], svx[6]],
[svy[2], svy[0], svy[0], svy[3]]])
line1 = Line2D(bd1_x, bd1_y, **boundary_properties)
line2 = Line2D(bd2_x, bd2_y, **boundary_properties)
line3 = Line2D(bd3_x, bd3_y, **boundary_properties)
fig.add_artist(line1)
fig.add_artist(line2)
fig.add_artist(line3)
# ==== Labels to the left
plt.text(0.018, subplot_vertices_y[5], 'Type 1: \n\nClassic \nsubglacial lakes', fontsize=15, va='center', transform=fig.transFigure)
plt.text(0.018, subplot_vertices_y[3], 'Type 2: \n\nSubglacial lakes \nin places where \nglaciers \nconverge', fontsize=15, va='center', transform=fig.transFigure)
plt.text(0.018, subplot_vertices_y[1], 'Type 3: \n\nPartially \nsubglacial, \npartially \nice-marginal', fontsize=15, va='center', transform=fig.transFigure)
# ==== Labels to the right
plt.text(0.89, 0.7, '$^{*}$Colormap \nfor 2 & 13:', fontsize=16, va='center', transform=fig.transFigure)
plt.text(0.89, 0.38, '$^{†}$Colormap \nfor 5, 7, 25, \n31, & 32:', fontsize=16, va='center', transform=fig.transFigure)
plt.text(0.89, 0.06, 'Scale bar \n= 1 km', fontsize=16, va='center', transform=fig.transFigure)
# ==== Save figure
fig.savefig('main_visual-sciadv.pdf')
fig.savefig('main_visual-sciadv.png')
# fig.savefig('main_visual-sciadv_300dpi.pdf', dpi=300)
# fig.savefig('main_visual-sciadv_300dpi.png', dpi=300)
# fig.savefig('main_visual-sciadv_600dpi.pdf', dpi=600)
# fig.savefig('main_visual-sciadv_600dpi.png', dpi=600)