python – Colorbar is needed when using Tripcolor to make two-triangle heatmaps

I want to do a two-triangle heatmap graph similar with the answer Python package to plot two heatmaps in one (split each square into two triangles) provided by JohanC.

My dataset are often NaN type, and if I remove plt.colorbar(img2,pad=0.05), the dataset will not be plotted. I guess it is due to NaN values, but is there a better way of plotting it? I tried NoneType and it seems more errors.

import matplotlib.pyplot  as plt
import numpy as np
from matplotlib.tri import Triangulation

dataset=[-0.1674, -0.988, -0.8619, 0.25882, 0.4415, 0.619, 0.743, 0.868, float('nan'), float('nan'), -0.6962, -0.5693, -0.4465, -0.2707, 0.9088, 0.031, 0.158, 0.334, 0.487, 0.6667, float('nan'), -0.09, -0.9057, 0.27003, -0.6042, 0.521, 0.695, float('nan'), float('nan'), float('nan'), float('nan'), -0.545, -0.359, -0.2396, 0.8842, 0.057, float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), -0.9534, -0.8257, 0.35309, float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), -0.658, -0.53, -0.3522, float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), -0.17, -0.9908, float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), -0.626, float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan')]
dataset = np.array(dataset) # this has no effect
M = 9
N = 9
x = np.arange(M + 1)
y = np.arange(N + 1)
xs, ys = np.meshgrid(x, y)
zs=(xs * ys)[:-1, :-1].ravel()
triangles1 = [(i + j*(M+1), i+1 + j*(M+1), i + (j+1)*(M+1)) for j in range(N) for i in range(M)]
triangles2 = [(i+1 + j*(M+1), i+1 + (j+1)*(M+1), i + (j+1)*(M+1)) for j in range(N) for i in range(M)]
triang1 = Triangulation(xs.ravel(), ys.ravel(), triangles1)
triang2 = Triangulation(xs.ravel(), ys.ravel(), triangles2)

img1=plt.tripcolor(triang1, zs, cmap=plt.get_cmap('inferno', 10)) # left-bottom part triangle
img2=plt.tripcolor(triang2, dataset, cmap=plt.get_cmap('viridis', 10)) # top-right part triangle
plt.colorbar(img1,)
plt.colorbar(img2,pad=0.05)
plt.show()

In addition, it seems difficult to set colorbars for subplots. Is it possible (Or is there a way) to plot the dataset2 without setting a colorbar?

dataset2={}
dataset2[0]=np.array([float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), 0.7679, float('nan'), float('nan'), float('nan'), -0.8276, float('nan'), -0.86851, -0.0021, -0.325431, float('nan'), 0.63345, -0.7858, -0.5043, -0.8269, -0.1499, -0.8686, -0.002, -0.32487, 0.76769, 0.63383, -0.7857, -0.5044, -0.8279, -0.1499, -0.86847, -0.00239, -0.32511, -0.23228, float('nan'), -0.7856, -0.5044, -0.8277, -0.15025, -0.86866, -0.00226, 0.67467, -0.23244, 0.6339, -0.7856, -0.5045, -0.8277, -0.1498, -0.86839, 0.99792, 0.67468, float('nan'), float('nan'), -0.7856, -0.50427, -0.8274, -0.14969, -0.86834, 0.99772, 0.67494, float('nan'), float('nan')])
dataset2[1]=np.array([float('nan'), float('nan'), -1.486, float('nan'), -1.528, float('nan'), -1.984, float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), -1.622, -1.341, -1.474, -1.797, -1.705, -1.838, float('nan'), float('nan'), float('nan'), -1.643, -1.363, -1.496, -1.819, -0.7272, -1.86, float('nan'), float('nan'), -1.343, -0.6665, -0.3857, -0.519, -0.8414, -0.7491, -0.8826, -0.1157, -0.8341, -0.1572, -0.479, -0.1983, -0.3313, -0.6547, -0.5621, -0.6959, -0.9285, -0.6473, -0.9697, -0.2928, -0.0113, -0.1453, -0.4675, -0.375, -0.5092, -0.9508, -0.6692, -0.9926, -0.3153, -0.0332, -0.1674, -0.4897, -0.3974, -0.5315, -0.9724, -0.6915, -0.0141, -0.3363, -0.0557, -0.1893, -0.5121, float('nan'), -0.5531609, -0.7856, -0.50427, -0.8274, -0.14969, -0.86834, 0.99772, 0.67494, float('nan'), float('nan')])
dataset2[2]=np.array([-0.7855, -0.5044, -0.82792, -0.14973, -0.868302, -0.0023, 0.67481, -0.23249, float('nan'), -0.7861, -0.5045, -0.82722, -0.149922, 0.1308, 0.99803, 0.67487, float('nan'), float('nan'), -0.7859, -0.5048, -0.8271, -0.14944, float('nan'), -0.00166, float('nan'), 0.76751, 0.63401, -0.7862, -0.5047, -0.8276, -0.14983, 0.13105, float('nan'), float('nan'), float('nan'), float('nan'), -0.7861, -0.5045, -0.8271, -0.14968, -0.86882, 0.99801, float('nan'), float('nan'), float('nan'), -0.7854, -0.5041, -0.8268, -0.14989, -0.868442, 0.998, float('nan'), float('nan'), float('nan'), -0.7862, -0.5051, -0.8275, -0.14973, -0.86902, 0.99769, float('nan'), 0.76731, float('nan'), -0.7862, -0.5046, -0.827, -0.1494, -0.86871, 0.99827, 0.67519, 0.76809, float('nan'), -0.7856, -0.50427, -0.8274, -0.14969, -0.86834, 0.99772, 0.67494, float('nan'), float('nan')])
fig,axs=plt.subplots(1,3)
for x in range(3):
        axs[x].tripcolor(triang1, zs, cmap=plt.get_cmap('YlGnBu_r', 10)) 
        axs[x].tripcolor(triang2, dataset2[x], cmap=plt.get_cmap('viridis', 10)) 
        axs[x].set_xlim(0,9)
        axs[x].set_ylim(0,9)
plt.show()

Finally, I used to plotting graphs by Seaborn, is there a way of plotting two-triangle heatmap by Seaborn?

Read more here: Source link