matplotlib - 使用 matplotlib 绘制具有分割对角线的热图
问题描述
我想使用matplotlib制作一个同时表示两个对称矩阵的热图,比如A和B,这样对角线上方的方块将根据A中的元素着色,对角线下方的方块将根据到 B 中的元素。
有两件事我不知道该怎么做:
对角线中的正方形应该穿过对角线分割,这样上面的三角形根据A中的对角元素着色,下面的三角形根据B中的对角元素着色。如何做到这一点?
应该为 A 和 B 使用两个单独的颜色图,因为 A 和 B 中的值的范围是不同的。如何将两个颜色图应用于同一个热图?一个相关的问题是如何放置两个对应的颜色条,一个在热图右侧用于 A,一个在底部用于 B。
任何帮助都感激不尽。
解决方案
我有类似的要求,按照这个Python 包将两个热图合二为一(将每个正方形分成两个三角形)并尝试根据我的需要对其进行修改。
在我下面的代码中,我的 x 轴应该是 SOMA 值的列表,y 轴应该是 Q 值的列表。QPrecision 和 Precision 是我在单元格的两个三角形中表示的两个不同的值。可以通过将位置属性更改为“底部”或“顶部”来修改颜色条的位置。我注意到的一件事是 PyCharm 无法正确显示图形,但保存的图像看起来像附加的图像
M = len(SOMA)
N = len(Q)
x = np.arange(M + 1)
y = np.arange(N + 1)
xs, ys = np.meshgrid(x, y)
zs1 = result['PRECISION']
zs2 = result['QPRECISION']
zs1 = zs1.astype(dtype=float)
zs2 = zs2.astype(dtype=float)
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)]
print(np.shape(triangles1))
print(np.shape(triangles2))
fig = plt.figure()
ax = fig.add_subplot(111)
triang1 = Triangulation(xs.ravel(), ys.ravel(), triangles1)
triang2 = Triangulation(xs.ravel(), ys.ravel(), triangles2)
newcmp = ListedColormap(['#DAFFAC','#8FFD03'])
img1 = ax.tripcolor(triang1, zs1, cmap=plt.get_cmap('Blues'))
img2 = ax.tripcolor(triang2, zs2, cmap=plt.get_cmap(newcmp))
cb1 = plt.colorbar(img2, ax=[ax], ticks=[5, 4] , location='left',label='Q based Precision', pad=0.15)
cb2 = plt.colorbar(img1, ax=[ax], ticks=[5, 4, 3, 2, 1, 0],location='right',label='Suppported Precision', pad =0.05)
labels = np.arange(4, int(5) + 1, 1)
cb1.set_ticks([4.25, 4.75])
cb1.set_ticklabels(labels)
for tick in ax.xaxis.get_majorticklabels():
tick.set_horizontalalignment("center")
plt.xlim(x[0], x[-1])
plt.ylim(y[0], y[-1])
plt.xlabel("SOMA")
plt.ylabel("Q")
x = np.arange(0.5,22,1) #range of SOMA
y = np.arange(0.5,14,1) #range of Q
plt.xticks(x, SOMA, rotation=90)
plt.yticks(y, Q)
plt.title(PLOT_TITLE)
plt.savefig('fig.png',bbox_inches='tight')
plt.show()
推荐阅读
- xml - 如何使用 Visual Studio 2017 创建项目组模板
- android - Android:从本地数据库读取时处理错误情况?
- kernel-module - 如何通过按钮连接到 gpio 来控制背光?
- c# - 创建多个自定义发票(自费和第三方付款人)
- angular - 错误消息:无法调用类型缺少调用签名的表达式
- mqtt - 如何使用 Tc3_IoTBase 在 TwinCAT 中处理大量 MQTT 订阅主题
- android - 如何在底部导航栏中心添加带有缺口的浮动操作按钮?
- ios - 从下到上查看动画
- c++ - 浮点精度不在字符串中格式化
- vue.js - 在 vue 中劫持一个组合键