'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?
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
