Made a rough surface projection function that can be quite useful if you don't want to deal with a 3D representation
Here's the code
def one_surface_projection(strain, axis, inverse):
strain_used = np.copy(strain)
if inverse:
strain_used = np.flip(strain_used, axis=axis)
# I have strain=nan outside the support so I can define the support here
# If not, use your own support as input
support = 1-np.isnan(strain_used)
support_surface = np.cumsum(support,axis=axis)
support_surface[support_surface>1] = 0
surface_strain = np.copy(strain_used)
surface_strain[support_surface==0] = np.nan
surface_strain = np.nanmean(surface_strain, axis=axis)
return surface_strain
def plot_surface_projections(strain, voxel_sizes,
fw=3, fig_title=None):
fig,ax = plt.subplots(2,3, figsize=(fw*3.3,fw*2))
extent = [[0, strain.shape[2]*voxel_sizes[2]*.1, 0, strain.shape[1]*voxel_sizes[1]*.1],
[0, strain.shape[2]*voxel_sizes[2]*.1, 0, strain.shape[0]*voxel_sizes[0]*.1],
[0, strain.shape[1]*voxel_sizes[1]*.1, 0, strain.shape[0]*voxel_sizes[0]*.1]]
imgs = []
for n1, axis in enumerate(range(3)):
for n0,inverse in enumerate([False, True]):
surface_strain = one_surface_projection(strain, axis, inverse)
imgs.append(ax[n0,n1].matshow(1e2*surface_strain, cmap='coolwarm', extent=extent[n1],
vmin=np.nanmin(1e2*strain), vmax=np.nanmax(1e2*strain)))
add_colorbar_subplot(fig,ax,imgs)
for axe in ax.flatten():
axe.locator_params(nbins=4)
xlabel = ['Z (nm)', 'Z (nm)', 'Y (nm)']
ylabel = ['Y (nm)', 'X (nm)', 'X (nm)']
for n in range(3):
for ii in range(2):
ax[ii,n].set_xlabel(xlabel[n],fontsize=15*fw/4.)
ax[ii,n].set_ylabel(ylabel[n],fontsize=15*fw/4.)
ax[ii,n].xaxis.set_ticks_position('bottom')
if fig_title is not None:
fig.suptitle(fig_title, fontsize=fw*20/4.)
fig.tight_layout()
return
Made a rough surface projection function that can be quite useful if you don't want to deal with a 3D representation
Here's the code