Pet*_*ler 2 python matplotlib heatmap plotly seaborn
我一直在四处寻找,但找不到通过将热图中的每个正方形分成两个三角形(类似于我在论文中看到的附加图形)来在一个图形中绘制两个热图的简单解决方案。有人知道能够做到这一点的 Python 包吗?我尝试过seaborn,但我认为它没有简单的方法来实现这一目标。
感谢您的时间!
-彼得
plt.tripcolor为三角形网格着色类似于为plt.pcolormesh矩形网格着色。也与 类似pcolormesh,必须注意顶点的行一列比三角形少。此外,阵列需要制成一维 ( np.ravel)。所有这些重新编号为 1D 可能有点棘手。
例如,下面的代码根据x*y mod 10上部和下部三角形的两种不同颜色图创建着色并使用它们。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.tri import Triangulation
M = 30
N = 20
x = np.arange(M + 1)
y = np.arange(N + 1)
xs, ys = np.meshgrid(x, y)
zs = (xs * ys) % 10
zs = zs[:-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), vmax=10)
img2 = plt.tripcolor(triang2, zs, cmap=plt.get_cmap('viridis', 10), vmax=10)
plt.colorbar(img2, ticks=range(10), pad=-0.05)
plt.colorbar(img1, ticks=range(10))
plt.xlim(x[0], x[-1])
plt.ylim(y[0], y[-1])
plt.xticks(x, rotation=90)
plt.yticks(y)
plt.show()
Run Code Online (Sandbox Code Playgroud)
PS:要在单元格的中心(而不是在它们的边界)很好地显示整数刻度,需要进行以下更改:
triang1 = Triangulation(xs.ravel()-0.5, ys.ravel()-0.5, triangles1)
triang2 = Triangulation(xs.ravel()-0.5, ys.ravel()-0.5, triangles2)
# ...
plt.xlim(x[0]-0.5, x[-1]-0.5)
plt.ylim(y[0]-0.5, y[-1]-0.5)
plt.xticks(x[:-1], rotation=90)
plt.yticks(y[:-1])
Run Code Online (Sandbox Code Playgroud)