Figure 2 script

Figure 2 script#

%matplotlib inline
import sys
sys.path.append('/home/whyjz278/Github/ac-subglacial-lakes')
import numpy as np
import matplotlib.pyplot as plt
import rasterio
from cmcrameri import cm
import achydro
from matplotlib.lines import Line2D
import matplotlib as mpl
from matplotlib.patches import BoxStyle
axes_settings = {'linewidth'   : 1.5}
mpl.rc('axes', **axes_settings)
vis_tif_list = ['../MilneTerminus/MilneTerminus_15m_hydroevent-evmd-bitmask_dh.tif',
                '../Milne/Milne_15m_hydroevent-evmd-bitmask_dh.tif',
                '../MilneCentral/MilneCentral_15m_hydroevent-evmd-bitmask_gp-dh.tif',
                '../OttoN/OttoN_15m_hydroevent-evmd-bitmask_dh.tif',
                '../IcebergE/IcebergE_15m_hydroevent-evmd-bitmask_slope.tif',
                '../AgassizSWMinor1/AgassizSWMinor1_15m_hydroevent-evmd-bitmask_dh.tif',
                '../TaggartLake/TaggartLake_15m_hydroevent-evmd-bitmask_slope.tif',
                '../MittieNE/MittieNE_15m_hydroevent-evmd-bitmask_dh.tif',
                '../YelvertonNW/YelvertonNW_15m_hydroevent-evmd-bitmask_dh.tif',
                '../UnnamedFW/UnnamedFW_15m_hydroevent-evmd-bitmask_dh.tif',
                '../UnnamedHSE/UnnamedHSE_15m_hydroevent-evmd-bitmask_gp-dh.tif',
                '../Antoinette/Antoinette_15m_hydroevent-evmd-bitmask_dh.tif',
                '../AgassizSWMinor2/AgassizSWMinor2_15m_hydroevent-evmd-bitmask_dh.tif',
                '../MittieMain/MittieMain_15m_hydroevent-evmd-bitmask_gp-dh.tif',
                '../ClydeRiverSW/ClydeRiverSW_15m_hydroevent-evmd-bitmask_gp-dh.tif',
                '../PennyN/PennyN_15m_hydroevent-evmd-bitmask_gp-dh.tif',
                '../PennyW/PennyW_15m_hydroevent-evmd-bitmask_dh.tif',
                '../SvenHedin/SvenHedin_15m_hydroevent-evmd-bitmask_dh.tif',
                '../MittieMinor/MittieMinor_15m_hydroevent-evmd-bitmask_dh.tif',
                '../OttoNW/OttoNW_15m_hydroevent-evmd-bitmask_dh.tif',
                '../Otto/Otto_15m_hydroevent-evmd-bitmask_dh.tif',
                '../Disraeli/Disraeli_15m_hydroevent-evmd-bitmask_dh.tif',
                '../UnnamedF/UnnamedF_15m_hydroevent-evmd-bitmask_dh.tif',
                '../Airdrop/Airdrop_15m_hydroevent-evmd-bitmask_dh.tif',
                '../LakeTuborgE/LakeTuborgE_15m_hydroevent-evmd-bitmask_slope.tif',
                '../GoodFriday/GoodFriday_15m_hydroevent-evmd-bitmask_dh.tif',
                '../GoodFriday/GoodFriday_15m_hydroevent-evmd-bitmask_dh.tif',
                '../Dlberville/Dlberville_15m_hydroevent-evmd-bitmask_gp-dh.tif',
                '../AgassizSWMain/AgassizSWMain_15m_hydroevent-evmd-bitmask_gp-dh.tif',
                '../AgassizSWMain/AgassizSWMain_15m_hydroevent-evmd-bitmask_dh.tif',
                '../JolliffeNArm/JolliffeNArm_15m_hydroevent-evmd-bitmask_slope.tif',
                '../MittieNW/MittieNW_15m_hydroevent-evmd-bitmask_slope.tif',
                '../BylotNE/BylotNE_15m_hydroevent-evmd-bitmask_dh.tif',
                '../ClydeRiverW/ClydeRiverW_15m_hydroevent-evmd-bitmask_gp-dh.tif']

# vis_tif_list = ['../Milne/Milne_15m_hydroevent-evmd-bitmask_dh.tif']
#                 '../MilneCentral/MilneCentral_15m_hydroevent-evmd-bitmask_gp-dh.tif']

# cm.lapaz

dh_type1_cm = cm.lapaz
dh_type1_cm.set_bad('k')
dh_type2_cm = cm.bilbao_r
dh_type2_cm.set_bad('k')
dh_type3_cm = cm.bam
dh_type3_cm.set_bad('k')

# cm.vik_r

cmap_list = [dh_type1_cm for i in range(34)]
for i in [1, 12]:
    cmap_list[i] = dh_type2_cm
for i in [4, 6, -10, -4, -3]:
    cmap_list[i] = dh_type3_cm

clim_list = [(-110, 0) for i in range(34)]
for i in [1, 12]:
    clim_list[i] = (0, 70)
for i in [4, 6, -10 ,-4, -3]:
    clim_list[i] = (-6, 6)
extent_ll_list = [(60, 160),
                  (220, 320),
                  (0, 340),
                  (80, 510),
                  (40, 320),
                  (200, 300),
                  (1250, 1080),
                  (170, 560),
                  (210, 520),
                  (130, 230),
                  (290, 370),
                  (160, 350),
                  (20, 240),
                  (170, 1300),
                  (0, 330),
                  (270, 860),
                  (440, 1910),
                  (110, 550),
                  (40, 310),
                  (60, 460),
                  (210, 270),
                  (640, 500),
                  (0, 790),
                  (120, 280),
                  (120, 500),
                  (630, 710),
                  (240, 1160),
                  (80, 380),
                  (320, 370),
                  (30, 850), 
                  (80, 1000),
                  (0, 1200),
                  (90, 310),
                  (150, 460)]
extent_size_list = [160,
                    170,
                    300,
                    230,
                    270,
                    300,
                    300,
                    170,
                    480,
                    230,
                    300,
                    240,
                    220,
                    650,
                    160,
                    830,
                    600,
                    390,
                    240,
                    340,
                    270,
                    160,
                    690,
                    210,
                    500,
                    300,
                    470,
                    270,
                    330,
                    450, 
                    1000,
                    800,
                    160,
                    280]
rgi_index_ACN = '../RGI2000-v7.0-G-03_arctic_canada_north_hydroloc.zip'
rgi_index_ACS = '../RGI2000-v7.0-G-04_arctic_canada_south_hydroloc.zip'
rgi_index_ACN_invert = '../RGI2000-v7.0-G-03_arctic_canada_north_hydroloc_invert.zip'
rgi_index_ACS_invert = '../RGI2000-v7.0-G-04_arctic_canada_south_hydroloc_invert.zip'
working_epsg = 3413

gdf_rgi_ACN = achydro.read_zipped_shapefile(rgi_index_ACN, working_epsg)
gdf_rgi_ACS = achydro.read_zipped_shapefile(rgi_index_ACS, working_epsg)
gdf_rgi_ACN_invert = achydro.read_zipped_shapefile(rgi_index_ACN_invert, working_epsg)
gdf_rgi_ACS_invert = achydro.read_zipped_shapefile(rgi_index_ACS_invert, working_epsg)
# 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)
../_images/dbf99c03e048244b3924657bffde5ba22ff5cc6154a4b34043a1d3f9ff3bd3d0.png