Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python包一次绘制两个热图(将每个正方形拆分为两个三角形)_Python_Matplotlib_Plotly_Seaborn_Heatmap - Fatal编程技术网

Python包一次绘制两个热图(将每个正方形拆分为两个三角形)

Python包一次绘制两个热图(将每个正方形拆分为两个三角形),python,matplotlib,plotly,seaborn,heatmap,Python,Matplotlib,Plotly,Seaborn,Heatmap,我一直在四处搜索,但找不到一个简单的解决方案,通过将热图中的每个正方形分成两个三角形(类似于我在论文中看到的附图),在一个图形中绘制两个热图。有人知道能够做到这一点的Python包吗?我试过seaborn,但我认为实现这一点并不容易 谢谢你抽出时间 -Peterplt.tripcolor为三角形网格着色,就像plt.pcolormesh为矩形网格着色一样。与pcolormesh类似,必须注意的是,顶点的一行和一列少于三角形。此外,阵列需要做成1D(np.ravel)。所有这些重新编号到1D可能

我一直在四处搜索,但找不到一个简单的解决方案,通过将热图中的每个正方形分成两个三角形(类似于我在论文中看到的附图),在一个图形中绘制两个热图。有人知道能够做到这一点的Python包吗?我试过seaborn,但我认为实现这一点并不容易

谢谢你抽出时间


-Peter

plt.tripcolor
为三角形网格着色,就像
plt.pcolormesh
为矩形网格着色一样。与pcolormesh类似,必须注意的是,顶点的一行和一列少于三角形。此外,阵列需要做成1D(
np.ravel
)。所有这些重新编号到1D可能有点棘手

例如,下面的代码根据
x*y mod 10
创建一个颜色,并为上下三角形使用两个不同的颜色贴图

将numpy导入为np
将matplotlib.pyplot作为plt导入
从matplotlib.tri导入三角剖分
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()
三角形1=[(i+j*(M+1),i+1+j*(M+1),i+(j+1)*(M+1))对于范围(N)中的j,对于范围(M)中的i]
三角形2=[(i+1+j*(M+1),i+1+(j+1)*(M+1),i+(j+1)*(M+1))对于范围(N)中的j,对于范围(M)中的i]
三角形1=三角剖分(xs.ravel(),ys.ravel(),triangles1)
三角形2=三角剖分(xs.ravel(),ys.ravel(),triangles2)
img1=plt.tripcolor(三角形1,zs,cmap=plt.get_cmap('inferno',10),vmax=10)
img2=plt.tripcolor(三角形2,zs,cmap=plt.get_cmap('viridis',10),vmax=10)
plt.colorbar(img2,刻度=范围(10),pad=-0.05)
plt.colorbar(img1,刻度=范围(10))
plt.xlim(x[0],x[-1])
plt.ylim(y[0],y[-1])
plt.xticks(x,旋转=90)
plt.yticks(y)
plt.show()

PS:要使整数刻度精确地位于单元格的中心(而不是其边框),需要进行以下更改:

triange1=三角剖分(xs.ravel()-0.5,ys.ravel()-0.5,triangles1)
三角形2=三角剖分(xs.ravel()-0.5,ys.ravel()-0.5,三角形2)
# ...
plt.xlim(x[0]-0.5,x[-1]-0.5)
plt.ylim(y[0]-0.5,y[-1]-0.5)
plt.xticks(x[:-1],旋转=90)
plt.yticks(y[:-1])

这不是违背了热图的目的吗?你能找到热点吗?@RichieV基本上,我想看看与两个不同属性相关的热点。我不需要在两个单独的图中找到同一个正方形,而是想把它放在同一个图中(类似于我所附的图片)。我知道图上写的是什么,我的评论是,热图通常用于快速查看热点区域。。。而且,这种组合形式使得很难一眼就发现它们。我个人更喜欢计算一个组合指示器,然后做一个常规的热图。是的,这看起来很棒!然而,我对如何使用这个有点困惑。因此,我有两个独立的(方形)数据数组(每个2D贴图一个)。这与xs,ys,zs有什么关系?非常感谢你的帮助!您需要
img1=plt.tripcolor(triange1,data\u array\u 1.ravel(),cmap=…)
img2=plt.tripcolor(triange2,data\u array\u 2.ravel(),cmap=…)
np.ravel()
将2D(或nD)数组更改为1D。演示代码使用
zs
两次来创建一个可验证的测试。这非常有效-非常感谢!只是对你答案的PS部分做了一个很小的修改。添加两行:plt.xticks(x[:-1],旋转=90)plt.yticks(y[:-1])