带有 X、Y 数据的 Matplotlib 热图

Posted

技术标签:

【中文标题】带有 X、Y 数据的 Matplotlib 热图【英文标题】:Matplotlib Heatmap with X, Y data 【发布时间】:2019-07-20 13:55:27 【问题描述】:

我想使用pcolor 或其他热图库在matplotlib 中制作热图。我找到了很多很好的例子,但无法确定如何以正确的格式获取我的数据,或者使用我的数据所在的格式进行绘图。

这是我的数据的设置方式

X  Y  Value
0  1  .6
0  2  .3
0  3  .2
1  1  .8
1  2  .4
1  3  .9

因此,XY 列表示 (X,Y) 对,其中 Value 是相应单元格的值。我正在努力寻找一种方法来转换数据以使用pcolor 或另一种绘图方法。任何帮助将不胜感激。

【问题讨论】:

官方文档中的这个链接提供了一个很好的例子:matplotlib.org/3.1.1/gallery/images_contours_and_fields/… 【参考方案1】:

您必须将 x 和 y 值转换为 2D numpy 数组。数组的二维表示 x 和 y,而值映射到热图颜色条。更多彩图给here。

import numpy as np
import matplotlib.pyplot as mpl
import matplotlib.cm as cmap

m = np.array([[.6, .3, .2], [.8, .4, .9]])
mpl.imshow(m, cmap=cmap.hot)
mpl.colorbar()
mpl.show()

产生

【讨论】:

你的代码中没有x,y 关系,你得到了二维矩阵,里面有值,图像是根据你提供的值生成的,它们都索引到3,有一些-half偏移量【参考方案2】:

看起来您使用的是 pandas 数据框。 在将枢轴数据框绘制为表格并使用热图方法之前,即来自 seaborn:

import seaborn as sns 
import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_clipboard()
table = df.pivot('Y', 'X', 'Value')
ax = sns.heatmap(table)
ax.invert_yaxis()
print(table)
plt.show()

输出:

X    0    1
Y
1  0.6  0.8
2  0.3  0.4
3  0.2  0.9

【讨论】:

【参考方案3】:

我迟到了,但这里是 OP 问题的解决方案,只使用 matplotlib,按照要求。它依赖于使用imshowextent 选项来完成这项工作。有关详细信息,请参阅matplotlib manual。

import matplotlib.pyplot as plt

xvals = [0,1]
yvals = [1,3]

zvals = [[0.6, 0.3, 0.2], [0.8, 0.4, 0.9]]

heatmap, ax = plt.subplots()

im = ax.imshow(zvals,cmap='inferno',extent=[xvals[0],xvals[1],yvals[0],yvals[1]],interpolation='nearest',origin='lower',aspect='auto')
ax.set(xlabel='some x', ylabel='some y')

cbar = heatmap.colorbar(im)
cbar.ax.set_ylabel('stuff')

heatmap.savefig('heatmap.png')

结果如下图

【讨论】:

以上是关于带有 X、Y 数据的 Matplotlib 热图的主要内容,如果未能解决你的问题,请参考以下文章

matplotlib 中的 3D 离散热图

X Y Z 数组数据到热图

python中的热图表示给定矩形区域中的(x,y)坐标

使用 Matplotlib 在带有图例的热图中显示不同大小的圆圈

每个单元格中带有文本的热图,带有 matplotlib 的 pyplot

使用 Seaborn 和 Matplotlib 在热图和线图的共享子图中对齐 x 轴刻度