带有 X、Y 数据的 Matplotlib 热图
Matplotlib Heatmap with X, Y data
我想使用 pcolor
或其他热图库在 matplotlib
中制作热图。我发现了很多很好的例子,但无法确定如何以正确的格式获取我的数据,或者使用我的数据所在的格式进行绘图。
我的数据是这样设置的
X Y Value
0 1 .6
0 2 .3
0 3 .2
1 1 .8
1 2 .4
1 3 .9
因此,X
和 Y
列表示 (X,Y)
对,其中 Value
是相应单元格的值。我正在努力寻找一种方法来转换数据以使用 pcolor
或其他绘图方法。任何帮助将不胜感激。
您必须将 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()
生产
您似乎在使用 pandas 数据框。
在将枢轴数据框绘制为 table 并使用热图方法之前,即来自 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
我来晚了,但这里有一个仅使用 matplotlib
来解决 OP 问题的方法,正如所要求的那样。它依赖于使用 imshow
的 extent
选项来完成这项工作。有关详细信息,请参阅 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')
结果如下图
我想使用 pcolor
或其他热图库在 matplotlib
中制作热图。我发现了很多很好的例子,但无法确定如何以正确的格式获取我的数据,或者使用我的数据所在的格式进行绘图。
我的数据是这样设置的
X Y Value
0 1 .6
0 2 .3
0 3 .2
1 1 .8
1 2 .4
1 3 .9
因此,X
和 Y
列表示 (X,Y)
对,其中 Value
是相应单元格的值。我正在努力寻找一种方法来转换数据以使用 pcolor
或其他绘图方法。任何帮助将不胜感激。
您必须将 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()
生产
您似乎在使用 pandas 数据框。 在将枢轴数据框绘制为 table 并使用热图方法之前,即来自 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
我来晚了,但这里有一个仅使用 matplotlib
来解决 OP 问题的方法,正如所要求的那样。它依赖于使用 imshow
的 extent
选项来完成这项工作。有关详细信息,请参阅 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')
结果如下图