如何解决Python程序包可将两个热图合二为一将每个正方形分成两个三角形
我一直在搜索,但是找不到一个简单的解决方案,即通过将热图中的每个正方形都分成两个三角形来绘制两个热图(类似于我在纸上看到的图形)。有人知道能够做到这一点的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(),triangles2)
img1 = plt.tripcolor(triang1,zs,cmap=plt.get_cmap('inferno',10),vmax=10)
img2 = plt.tripcolor(triang2,cmap=plt.get_cmap('viridis',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()
PS:要使整数很好地位于单元格的中心(而不是它们的边界),需要进行以下更改:
triang1 = Triangulation(xs.ravel()-0.5,ys.ravel()-0.5,triangles1)
triang2 = Triangulation(xs.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])
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。