This notebook shows the stackplots (spacetime plots) along artificial slits placed in the east and west upflow regions observed by EUI/HRIEUV. Link to Figure 9.

Note: The internal hyperlink only works on GitHub Pages or nbviewer. Do not click when viewing the notebook on GitHub.

In [1]:
import numpy as np
import sunpy
import sunpy.map
from sunpy.coordinates import propagate_with_solar_surface
import matplotlib.pyplot as plt
import matplotlib.lines as mlines
from matplotlib.patches import Polygon
from matplotlib import rc_context
from matplotlib import patheffects as path_effects
import astropy.units as u
from astropy.coordinates import SkyCoord
import astropy.constants as const
from astropy.time import Time
from astropy.visualization import (ImageNormalize, AsinhStretch,
                                   ZScaleInterval)
from astropy.convolution import convolve, Gaussian2DKernel
from map_coalign import MapSequenceCoalign
from glob import glob
from watroo import wow
from skimage import draw, measure
import skimage.measure.profile
from ndcube import NDCube
from ndcube.extra_coords import (TimeTableCoordinate,
                                 QuantityTableCoordinate)
from fancy_colorbar import plot_colorbar, wcs_scalebar
import cmcrameri.cm as cmcm
import cv2
In [2]:
ms_style_dict = {'text.usetex': True, 'font.family': 'serif', 'axes.linewidth': 1.2,
                 'xtick.major.width': 1.2, 'xtick.major.size': 4,
                 'ytick.major.width': 1.2, 'ytick.major.size': 4,
                 'xtick.minor.width': 1.2, 'xtick.minor.size': 2,
                 'ytick.minor.width': 1.2, 'ytick.minor.size': 2,
                 'xtick.direction': 'in', 'ytick.direction': 'in',
                 'text.latex.preamble': r'\usepackage[T1]{fontenc}'
                 r'\usepackage{amsmath}' r'\usepackage{siunitx}'
                 r'\sisetup{detect-all=True}' r'\usepackage{fixltx2e}'}
In [3]:
hri_1020_files = sorted(glob("../../src/EUI/HRI/euv174/20221020/coalign_step_boxcar/*.fits"))
hri_1020_map_seq = MapSequenceCoalign(sunpy.map.Map(hri_1020_files))
hri_1020_map_seq = hri_1020_map_seq.submap(bottom_left=[300,760]*u.pix, top_right=[430,890]*u.pix)
hri_1020_map_seq_data = hri_1020_map_seq.as_array()
In [4]:
hri_1020_map_mean = np.nanmean(hri_1020_map_seq_data, axis=-1)
hri_1020_map_seq_noise_pixel = np.where(hri_1020_map_mean < np.nanpercentile(hri_1020_map_mean, 0.5))
hri_1020_map_noise_level_est = np.nanmean(np.nanstd(hri_1020_map_seq_data[*hri_1020_map_seq_noise_pixel, :],axis=-1))
hri_1020_map_std = np.sqrt(np.nanstd(hri_1020_map_seq_data, axis=-1)**2 - hri_1020_map_noise_level_est**2)/hri_1020_map_mean
hri_1020_map_std = np.nan_to_num(hri_1020_map_std, nan=0.0,)
/tmp/ipykernel_98799/2177313113.py:4: RuntimeWarning: invalid value encountered in sqrt
  hri_1020_map_std = np.sqrt(np.nanstd(hri_1020_map_seq_data, axis=-1)**2 - hri_1020_map_noise_level_est**2)/hri_1020_map_mean
In [5]:
hri_1020_Txshift = (9.41462 - 20.8515)*u.arcsec
hri_1020_Tyshift = (7.05089-8.29747)*u.arcsec
hri_1020_map_wow = hri_1020_map_seq[181].shift_reference_coord(hri_1020_Txshift,hri_1020_Tyshift)
hri_1020_map_wow = sunpy.map.Map(wow(hri_1020_map_seq_data[:,:,320], bilateral=1, denoise_coefficients=[5,3])[0],
                                 hri_1020_map_wow.meta)
hri_1020_map_std = sunpy.map.Map(hri_1020_map_std, hri_1020_map_wow.meta)
In [6]:
spice_NeVIII_vel_map_1020_zoomin = sunpy.map.Map("../../src/coalign_map/20221020/saffron_vel_map_zoomin_east.fits")
In [7]:
hri_1026_files = sorted(glob("../../src/EUI/HRI/euv174/20221026/coalign_step_boxcar/*.fits"))
hri_1026_map_seq = MapSequenceCoalign(sunpy.map.Map(hri_1026_files))
hri_1026_map_seq = hri_1026_map_seq.submap(bottom_left=[1780,480]*u.pix, top_right=[1950,650]*u.pix)
hri_1026_map_seq_data = hri_1026_map_seq.as_array()
In [8]:
hri_1026_map_mean = np.nanmean(hri_1026_map_seq_data, axis=-1)
hri_1026_map_seq_noise_pixel = np.where(hri_1026_map_mean < np.nanpercentile(hri_1026_map_mean, 0.5))
hri_1026_map_noise_level_est = np.nanmean(np.nanstd(hri_1026_map_seq_data[*hri_1026_map_seq_noise_pixel, :],axis=-1))
hri_1026_map_std = np.sqrt(np.nanstd(hri_1026_map_seq_data, axis=-1)**2 - hri_1026_map_noise_level_est**2)/hri_1026_map_mean
hri_1026_map_std = np.nan_to_num(hri_1026_map_std, nan=0.0,)
/tmp/ipykernel_98799/356689771.py:4: RuntimeWarning: invalid value encountered in sqrt
  hri_1026_map_std = np.sqrt(np.nanstd(hri_1026_map_seq_data, axis=-1)**2 - hri_1026_map_noise_level_est**2)/hri_1026_map_mean
In [9]:
hri_1026_Txshift = (-0.0235313 - 6.3736)*u.arcsec
hri_1026_Tyshift = (7.82867 - 0.685765)*u.arcsec
hri_1026_map_wow = hri_1026_map_seq[181].shift_reference_coord(hri_1026_Txshift,hri_1026_Tyshift)
hri_1026_map_wow = sunpy.map.Map(wow(hri_1026_map_seq_data[:,:,145], bilateral=1, denoise_coefficients=[5,3])[0],
                                 hri_1026_map_wow.meta)
hri_1026_map_std = sunpy.map.Map(hri_1026_map_std, hri_1026_map_wow.meta)
In [10]:
def generate_slit_data(select_x, select_y, line_width, image_seq_prep, wcs_index=0, map_wcs=None):
    pixels_idy, pixels_idx = None, None
    nt = image_seq_prep.nt

    for ii in range(len(select_x) - 1):
        pixels_idy_, pixels_idx_ = measure.profile._line_profile_coordinates(
            (select_y[ii], select_x[ii]),
            (select_y[ii + 1], select_x[ii + 1]),
            linewidth=line_width
        )
        if ii == 0:
            pixels_idy, pixels_idx = pixels_idy_, pixels_idx_
        else:
            pixels_idy = np.vstack((pixels_idy, pixels_idy_[1:]))
            pixels_idx = np.vstack((pixels_idx, pixels_idx_[1:]))

    pixels_idy_center = np.nanmean(pixels_idy, axis=1)
    pixels_idx_center = np.nanmean(pixels_idx, axis=1)

    world_coord_center, world_coord_all, world_coord_center_distance = None, None, None

    world_coord_center = map_wcs.pixel_to_world(pixels_idx_center, pixels_idy_center)
    world_coord_all = map_wcs.pixel_to_world(pixels_idx, pixels_idy)

    world_coord_center_distance = []
    for ii, pixels_center_ in enumerate(world_coord_center):
        if ii == 0:
            world_coord_center_distance.append(0 * u.arcsec)
        else:
            world_coord_center_distance.append(
                world_coord_center[ii].separation(world_coord_center[ii - 1]).to(u.arcsec) +
                world_coord_center_distance[ii - 1]
            )
    world_coord_center_distance = u.Quantity(world_coord_center_distance).to_value(u.rad) * image_seq_prep[wcs_index].dsun
    world_coord_center_distance_interp = np.linspace(
        world_coord_center_distance[0], world_coord_center_distance[-1],
        len(world_coord_center_distance)
    )


    pixel_distance = np.cumsum(np.sqrt(np.diff(pixels_idx_center) ** 2 + np.diff(pixels_idy_center) ** 2))
    pixel_distance = np.insert(pixel_distance, 0, 0)
    pixel_distance_interp = np.linspace(pixel_distance[0], pixel_distance[-1], len(pixel_distance))

    intensity = []
    for tt in range(nt):
        for ii in range(len(select_x) - 1):

            line = measure.profile_line(
                image_seq_prep[tt].data, (select_y[ii], select_x[ii]),
                (select_y[ii + 1], select_x[ii + 1]), linewidth=line_width,
                reduce_func=np.nanmean
            )

            if ii == 0:
                intensity_ = line
            else:
                intensity_ = np.concatenate((intensity_, line[1:]))

        intensity_interp = np.interp(world_coord_center_distance_interp, world_coord_center_distance, intensity_)

        intensity.append(intensity_interp)

    slit_intensity = u.Quantity(intensity).T
    # slit_intensity_sharp = skimage.filters.unsharp_mask(slit_intensity, radius=(31,0), amount=1.5, preserve_range=True)
    # slit_intensity_sharp = (slit_intensity - cv2.GaussianBlur(slit_intensity,(1,29),0,10))/cv2.GaussianBlur(slit_intensity,(1,29),0,10)
    gaussian_kernel = Gaussian2DKernel(x_stddev=1e-3, y_stddev=5)
    slit_intensity_convolve = convolve(slit_intensity, gaussian_kernel, boundary='extend')
    slit_intensity_sharp = (slit_intensity - slit_intensity_convolve)/slit_intensity_convolve
    # slit_intensity_sharp = wow(slit_intensity.value, bilateral=1, denoise_coefficients=[5,3])[0]
    # slit_intensity_sharp = np.gradient(slit_intensity, axis=-1)
    
    # slit_intensity_sharp = skimage.filters.sato(slit_intensity, sigmas=[1,], black_ridges=False)
    # slit_intensity_sharp = skimage.filters.butterworth(slit_intensity, 0.005, order=2)
    # slit_intensity_sharp = slit_intensity - np.nanmean(slit_intensity, axis=-1)[:,np.newaxis]
    # slit_intensity_sharp = slit_intensity_sharp/np.nanmean(slit_intensity_sharp, axis=-1)[:,np.newaxis]

    spacetime_wcs = (
        TimeTableCoordinate(Time([map_.date for map_ in image_seq_prep]), physical_types="time", names="time") &
        QuantityTableCoordinate(world_coord_center_distance_interp.to(u.Mm), physical_types="length", names="distance")
    ).wcs
    slit_cube = NDCube(slit_intensity_sharp, spacetime_wcs)

    return pixels_idx, pixels_idy, slit_cube
In [11]:
def plot_slit_position(pixels_idx, pixels_idy, ax1, ax2, triangle_length=1, triangle_anchor_index=5, triangle_ratio=0.6,
                       color='#58B2DC', lw=1, alpha=0.8, text=None, text_color=None, text_offset=10, text_fontsize=10):
    boundary_x = np.concatenate((pixels_idx[:, 0], pixels_idx[-1, 1:], pixels_idx[-1::-1, -1], pixels_idx[0, -1::-1]))
    boundary_y = np.concatenate((pixels_idy[:, 0], pixels_idy[-1, 1:], pixels_idy[-1::-1, -1], pixels_idy[0, -1::-1]))

    slit_boundary_collection = []
    boundary_x_line2d_ax1 = mlines.Line2D(boundary_x, boundary_y, color=color, lw=lw, alpha=alpha)
    boundary_x_line2d_ax2 = mlines.Line2D(boundary_x, boundary_y, color=color, lw=lw, alpha=alpha)
    slit_boundary_collection.append(ax1.add_line(boundary_x_line2d_ax1))
    slit_boundary_collection.append(ax2.add_line(boundary_x_line2d_ax2))

    triangle_anchor_point_0 = np.array([pixels_idx[triangle_anchor_index, 0], pixels_idy[triangle_anchor_index, 0]])
    triangle_anchor_point_1 = np.array([pixels_idx[triangle_anchor_index + triangle_length, 0], pixels_idy[triangle_anchor_index + triangle_length, 0]])
    triangle_bottom_vec = triangle_anchor_point_1 - triangle_anchor_point_0
    triangle_bottom_vec_rot_90 = np.array([triangle_bottom_vec[1], -triangle_bottom_vec[0]])*triangle_ratio
    triangle_anchor_point_2 = triangle_anchor_point_0 + triangle_bottom_vec_rot_90

    triangle_points = np.vstack((triangle_anchor_point_0, triangle_anchor_point_1, triangle_anchor_point_2,))
    
    for ax_ in (ax1,ax2):
        triangle_patch = Polygon(triangle_points, closed=True, edgecolor=color, facecolor=color, alpha=alpha)
        ax_.add_patch(triangle_patch)

    if text is not None:
        if text_color is None:
            text_color = color
        slit_center_x = np.nanmean(pixels_idx)
        slit_center_y = np.nanmean(pixels_idy)
        triangle_bottom_vec_rot_90_norm = triangle_bottom_vec_rot_90/np.linalg.norm(triangle_bottom_vec_rot_90)

        for ax_ in (ax1, ax2):
            ax_.text(slit_center_x + text_offset*triangle_bottom_vec_rot_90_norm[0], 
                     slit_center_y + text_offset*triangle_bottom_vec_rot_90_norm[1], text,
                    color=text_color, fontsize=text_fontsize, ha='center', va='center',
                    )


    return slit_boundary_collection
In [12]:
hri_1026_map_wow.wcs.world_to_pixel(SkyCoord(1882*u.arcsec + hri_1026_Txshift, 448*u.arcsec + hri_1026_Tyshift, frame=hri_1026_map_wow.coordinate_frame))
Out[12]:
(array(14.36796876), array(90.53756491))
In [13]:
hri_1026_map_wow.wcs.world_to_pixel(SkyCoord(1908*u.arcsec + hri_1026_Txshift, 461*u.arcsec + hri_1026_Tyshift, frame=hri_1026_map_wow.coordinate_frame))
Out[13]:
(array(68.77557016), array(113.57321188))

Figure 9¶

(You may have to pull down to see the notebook preview of the figure)

back to top

In [14]:
hri_1020_slit_1_pix_x, hri_1020_slit_1_pix_y = [80,65], [90,120]
hri_1020_slit_1_pixels_idx, hri_1020_slit_1_pixels_idy, hri_1020_slit_1_cube = \
    generate_slit_data(hri_1020_slit_1_pix_x, hri_1020_slit_1_pix_y, 7, hri_1020_map_seq,
                       map_wcs=hri_1020_map_wow.wcs)

hri_1020_slit_2_pix_x, hri_1020_slit_2_pix_y = [60,20], [64,88]
hri_1020_slit_2_pixels_idx, hri_1020_slit_2_pixels_idy, hri_1020_slit_2_cube = \
    generate_slit_data(hri_1020_slit_2_pix_x, hri_1020_slit_2_pix_y, 7, hri_1020_map_seq,
                       map_wcs=hri_1020_map_wow.wcs)

hri_1020_slit_3_pix_x, hri_1020_slit_3_pix_y = [90,83.3], [65,25]
hri_1020_slit_3_pixels_idx, hri_1020_slit_3_pixels_idy, hri_1020_slit_3_cube = \
    generate_slit_data(hri_1020_slit_3_pix_x, hri_1020_slit_3_pix_y, 7, hri_1020_map_seq,
                          map_wcs=hri_1020_map_wow.wcs)

hri_1026_slit_4_pix_x, hri_1026_slit_4_pix_y = [55,120], [33,29]
hri_1026_slit_4_pixels_idx, hri_1026_slit_4_pixels_idy, hri_1026_slit_4_cube = \
    generate_slit_data(hri_1026_slit_4_pix_x, hri_1026_slit_4_pix_y, 7, hri_1026_map_seq,
                          map_wcs=hri_1026_map_wow.wcs)

hri_1026_slit_5_pix_x, hri_1026_slit_5_pix_y = [27,70], [78,87.5]
hri_1026_slit_5_pixels_idx, hri_1026_slit_5_pixels_idy, hri_1026_slit_5_cube = \
    generate_slit_data(hri_1026_slit_5_pix_x, hri_1026_slit_5_pix_y, 7, hri_1026_map_seq,
                            map_wcs=hri_1026_map_wow.wcs)

hri_1026_slit_6_pix_x, hri_1026_slit_6_pix_y = [45,45+25*1.2], [100,100+12]
hri_1026_slit_6_pixels_idx, hri_1026_slit_6_pixels_idy, hri_1026_slit_6_cube = \
    generate_slit_data(hri_1026_slit_6_pix_x, hri_1026_slit_6_pix_y, 5, hri_1026_map_seq,
                            map_wcs=hri_1026_map_wow.wcs)


with rc_context(ms_style_dict):
    fig = plt.figure(figsize=(5, 10), layout='constrained')
    gs = fig.add_gridspec(10, 2, height_ratios = [1]*2 + [0.8]*3 + [1]*2 + [0.8]*3)
    ax1 = fig.add_subplot(gs[:2, 0], projection=hri_1020_map_wow)
    ax2 = fig.add_subplot(gs[:2, 1], projection=hri_1020_map_wow)

    hri_1020_map_wow.plot(axes=ax1, cmap='sdoaia171', title=False,
                        norm=ImageNormalize())
    im2 = hri_1020_map_std.plot(axes=ax2, cmap='magma', title=False,
                            norm=ImageNormalize(vmin=np.nanpercentile(hri_1020_map_std.data, 1),
                                                vmax=np.nanpercentile(hri_1020_map_std.data, 99.9),
                                                stretch=AsinhStretch(0.5)))
    
    for ax_ in (ax1,ax2):
        bounds = ax_.axis()
        with propagate_with_solar_surface(rotation_model='rigid'):
            spice_NeVIII_vel_map_1020_zoomin.draw_contours(levels=[-20],colors=["#113285"],alpha=0.8,
                                                                        axes=ax_,linestyles='solid')
        ax_.axis(bounds)
    
    plot_colorbar(im2, ax2, bbox_to_anchor=(1.05, 0, 0.07, 1))


    plot_slit_position(hri_1020_slit_1_pixels_idx, hri_1020_slit_1_pixels_idy, ax1, ax2, triangle_length=5, triangle_anchor_index=10, triangle_ratio=0.6,
                    color="#A5DEE4", alpha=1, text=r'\textbf{S1}',text_offset=12)
    
    
    plot_slit_position(hri_1020_slit_2_pixels_idx, hri_1020_slit_2_pixels_idy, ax1, ax2, triangle_length=5, triangle_anchor_index=10, triangle_ratio=0.6,
                    color="#A5DEE4", alpha=1, text=r'\textbf{S2}',text_offset=10)
    
    plot_slit_position(hri_1020_slit_3_pixels_idx, hri_1020_slit_3_pixels_idy, ax1, ax2, triangle_length=5, triangle_anchor_index=10, triangle_ratio=0.6,
                    color="#A5DEE4", alpha=1, text=r'\textbf{S3}',text_offset=12)

    wcs_scalebar(ax1,length=1*u.Mm, color='black', label=r'1 Mm', corner='bottom right', borderpad=0.0, 
                    frame=True,bbox_props=dict(boxstyle='round,pad=-0.1',facecolor='white', edgecolor='#91989F', alpha=0.7),
                    dsun=hri_1020_map_wow.dsun)
    
    ax3 = fig.add_subplot(gs[2, :], projection=hri_1020_slit_1_cube.wcs)
    hri_1020_slit_1_cube.plot(axes=ax3, aspect='auto', cmap='sdoaia171',
                              norm=ImageNormalize(vmin=np.nanpercentile(hri_1020_slit_1_cube.data, 0.1),
                                                  vmax=np.nanpercentile(hri_1020_slit_1_cube.data, 99.9),
                                                  ))

    ax4 = fig.add_subplot(gs[3, :], projection=hri_1020_slit_2_cube.wcs)
    hri_1020_slit_2_cube.plot(axes=ax4, aspect='auto', cmap='sdoaia171',
                              norm=ImageNormalize(vmin=np.nanpercentile(hri_1020_slit_2_cube.data, 0.1),
                                                  vmax=np.nanpercentile(hri_1020_slit_2_cube.data, 99.9),
                                                  ))
    
    ax5 = fig.add_subplot(gs[4, :], projection=hri_1020_slit_3_cube.wcs)
    hri_1020_slit_3_cube.plot(axes=ax5, aspect='auto', cmap='sdoaia171',
                              norm=ImageNormalize(vmin=np.nanpercentile(hri_1020_slit_3_cube.data, 0.1),
                                                  vmax=np.nanpercentile(hri_1020_slit_3_cube.data, 99.5),
                                                  ))
    
    for ax_ in (ax3,ax4,ax5):
        ax_.axvline(320, color='white', lw=0.5, alpha=0.8, ls='--')
    
    ax6 = fig.add_subplot(gs[5:7, 0], projection=hri_1026_map_wow)
    ax7 = fig.add_subplot(gs[5:7, 1], projection=hri_1026_map_wow)

    hri_1026_map_wow.plot(axes=ax6, cmap='sdoaia171', title=False,
                        norm=ImageNormalize())
    
    im7 = hri_1026_map_std.plot(axes=ax7, cmap='magma', title=False,
                            norm=ImageNormalize(vmin=np.nanpercentile(hri_1026_map_std.data, 0.1),
                                                vmax=np.nanpercentile(hri_1026_map_std.data, 99.9),
                                                stretch=AsinhStretch(0.5)))
    
    wcs_scalebar(ax6,length=1*u.Mm, color='black', label=r'1 Mm', corner='bottom right', borderpad=0.0, 
                frame=True,bbox_props=dict(boxstyle='round,pad=-0.1',facecolor='white', edgecolor='#91989F', alpha=0.7),
                dsun=hri_1026_map_wow.dsun)
    
    plot_colorbar(im7, ax7, bbox_to_anchor=(1.05, 0, 0.07, 1))

    plot_slit_position(hri_1026_slit_4_pixels_idx, hri_1026_slit_4_pixels_idy, ax6, ax7, triangle_length=5, triangle_anchor_index=10, triangle_ratio=0.6,
                    color="#A5DEE4", alpha=1, text=r'\textbf{S4}',text_offset=12)
    
    plot_slit_position(hri_1026_slit_5_pixels_idx, hri_1026_slit_5_pixels_idy, ax6, ax7, triangle_length=5, triangle_anchor_index=10, triangle_ratio=0.6,
                    color="#A5DEE4", alpha=1, text=r'\textbf{S5}',text_offset=15)
    
    plot_slit_position(hri_1026_slit_6_pixels_idx, hri_1026_slit_6_pixels_idy, ax6, ax7, triangle_length=5, triangle_anchor_index=10, triangle_ratio=0.6,
                    color="#A5DEE4", alpha=1, text=r'\textbf{S6}',text_offset=-15)
    

    ax8 = fig.add_subplot(gs[7,:], projection=hri_1026_slit_4_cube.wcs)
    hri_1026_slit_4_cube.plot(axes=ax8, aspect='auto', cmap='sdoaia171',
                              norm=ImageNormalize(vmin=np.nanpercentile(hri_1026_slit_4_cube.data, 1),
                                                    vmax=np.nanpercentile(hri_1026_slit_4_cube.data, 99.9),
                                                  stretch=AsinhStretch(0.5)))
    
    ax9 = fig.add_subplot(gs[8,:], projection=hri_1026_slit_5_cube.wcs)
    hri_1026_slit_5_cube.plot(axes=ax9, aspect='auto', cmap='sdoaia171',
                              norm=ImageNormalize(vmin=np.nanpercentile(hri_1026_slit_5_cube.data, 1),
                                                    vmax=np.nanpercentile(hri_1026_slit_5_cube.data, 99.9),
                                                  stretch=AsinhStretch(0.5)), interpolation='none')
    
    ax10 = fig.add_subplot(gs[9,:], projection=hri_1026_slit_6_cube.wcs)
    hri_1026_slit_6_cube.plot(axes=ax10, aspect='auto', cmap='sdoaia171',
                              norm=ImageNormalize(vmin=np.nanpercentile(hri_1026_slit_6_cube.data, 1),
                                                    vmax=np.nanpercentile(hri_1026_slit_6_cube.data, 99.9),
                                                  stretch=AsinhStretch(0.5)), interpolation='none')
    
    for ax_ in (ax8,ax9,ax10):
        ax_.axvline(145, color='white', lw=0.5, alpha=0.8, ls='--')


    ax1.set_xlabel('Solar-X (arcsec)', labelpad=0.8)
    ax1.set_ylabel('Solar-Y (arcsec)',)

    ax2.coords[1].axislabels.set_visible(False)
    ax2.coords[1].set_ticklabel_visible(False)
    ax2.set_xlabel('Solar-X (arcsec)', labelpad=0.8)

    ax6.set_xlabel('Solar-X (arcsec)', labelpad=0.8)
    ax6.set_ylabel('Solar-Y (arcsec)',)

    ax7.coords[1].axislabels.set_visible(False)
    ax7.coords[1].set_ticklabel_visible(False)
    ax7.set_xlabel('Solar-X (arcsec)', labelpad=0.8)

    ax1.text(0.05, 0.95, r'\textbf{a) HRI\textsubscript{EUV}}', transform=ax1.transAxes, color='white', fontsize=10, 
             ha='left', va='top', path_effects=[path_effects.withStroke(linewidth=2, foreground='black')])
    
    ax2.text(0.05, 0.95, r'\textbf{b)} $\boldsymbol{\sigma/\mu}$', transform=ax2.transAxes, color='white', fontsize=10,
                ha='left', va='top', path_effects=[path_effects.withStroke(linewidth=2, foreground='black')])
    
    ax3.text(0.02, 0.92, r'\textbf{S1}', transform=ax3.transAxes, color='white', fontsize=10,
                ha='left', va='top', path_effects=[path_effects.withStroke(linewidth=2, foreground='black')])
    
    ax4.text(0.02, 0.92, r'\textbf{S2}', transform=ax4.transAxes, color='white', fontsize=10,
                ha='left', va='top', path_effects=[path_effects.withStroke(linewidth=2, foreground='black')])
    
    ax5.text(0.02, 0.92, r'\textbf{S3}', transform=ax5.transAxes, color='white', fontsize=10,
                ha='left', va='top', path_effects=[path_effects.withStroke(linewidth=2, foreground='black')])

    for ax_ in (ax3,ax4,ax5):
        ax_.coords[0].set_ticklabel_visible(False)
        ax_.coords[0].axislabels.set_visible(False)
        ax_.coords[1].set_ticks(spacing=2*u.Mm)
        ax_.set_ylabel('(Mm)')
    
    ax5.coords[0].set_ticklabel_visible(True)
    ax5.coords[0].axislabels.set_visible(True)
    ax5.set_xlabel(r'Time (s) from {} ($t_{{\oplus}}$)'.format(hri_1020_map_seq[0].meta['date_ear'][:-4]),labelpad=0.8)

    ax6.text(0.05, 0.95, r'\textbf{c) HRI\textsubscript{EUV}}', transform=ax6.transAxes, color='white', fontsize=10,
                ha='left', va='top', path_effects=[path_effects.withStroke(linewidth=2, foreground='black')])   
    
    ax7.text(0.05, 0.95, r'\textbf{d)} $\boldsymbol{\sigma/\mu}$', transform=ax7.transAxes, color='white', fontsize=10,
                ha='left', va='top', path_effects=[path_effects.withStroke(linewidth=2, foreground='black')])   
    
    ax8.text(0.02, 0.92, r'\textbf{S4}', transform=ax8.transAxes, color='white', fontsize=10,
                ha='left', va='top', path_effects=[path_effects.withStroke(linewidth=2, foreground='black')])
    
    ax9.text(0.02, 0.92, r'\textbf{S5}', transform=ax9.transAxes, color='white', fontsize=10,
                ha='left', va='top', path_effects=[path_effects.withStroke(linewidth=2, foreground='black')])
    
    ax10.text(0.02, 0.92, r'\textbf{S6}', transform=ax10.transAxes, color='white', fontsize=10,
                ha='left', va='top', path_effects=[path_effects.withStroke(linewidth=2, foreground='black')])

    ax8.coords[0].set_ticklabel_visible(False)
    ax8.coords[0].axislabels.set_visible(False)
    ax8.coords[1].set_ticks(spacing=3*u.Mm)
    ax8.set_ylabel('(Mm)')

    ax9.coords[0].set_ticklabel_visible(False)
    ax9.coords[0].axislabels.set_visible(False)
    ax9.coords[1].set_ticks(spacing=3*u.Mm)
    ax9.set_ylabel('(Mm)')

    ax10.set_xlabel(r'Time (s) from {} ($t_{{\oplus}}$)'.format(hri_1026_map_seq[0].meta['date_ear'][:-4]),labelpad=0.8)
    ax10.set_ylabel('(Mm)')
    ax10.coords[1].set_ticks(spacing=2*u.Mm)

    fig.get_layout_engine().set(w_pad=1/72., h_pad=0., hspace=0,
                            wspace=0)
    

    plt.savefig("../../figs/ms_eis_eui_upflow/eui_upflow_stackplot.pdf", bbox_inches='tight', dpi=300)
    plt.show()
No description has been provided for this image