热映射在x-y平面上,z为加权

时间:2018-02-19 12:47:51

标签: python numpy plot heatmap contour

我在这个论坛上经历了几十个关于热图的答案,但我仍然遇到问题,所以我想我会问自己。请记住,直到一个月前我才不知道Python是什么。

所以,我在三列中有一个大型数据文件。前两个是标准的x-y坐标。对于每个点,都有第三个变量z,我想用它作为加权来构建某种热图。

我见过几种方法,例如使用meshgrid或更改数组大小,但我认为问题是我的数组不是常规或矩形。它只是x-y平面中的一堆杂乱,彼此之间没有均匀分布,每个都有一个z值。

以下是我在电子表格中提供的一小段数据:

x y z
392 616 0.5
416 614 1
497 603 3
533 598 3.5
383 589 0.5
574 574 4
...

我尝试了几种方法,例如重塑数组,但我总是遇到某种错误。如何将此数据绘制为热图,并使用z给出的每个点的权重?谢谢。

我知道,由于数据点没有规则间隔,因此热图可能会出现零间隙,但我可以通过我想出的方法外推它们的权重来排序,以便不会有问题。

我最接近获得我正在寻找的图表是使用此代码:

plt.hist2d(x, y, bins=8, weights=z, cmap="Greys")
plt.colorbar()

然而,问题在于,如果给定的“bin”中存在多个点,则计算“聚合”权重 - 例如如果在特定的箱子中有两个数据点,其权重分别为1和2.5,则箱子将被着色,好像其权重为1 + 2.5 = 3.5。有什么方法可以让它显示与最靠近bin中心的数据点的权重相对应的颜色?

e.g。如果加权2.5的数据点真的接近bin中心,而加权1的数据点沿着bin的一个边缘,有没有办法可以让bin加权2.5?

谢谢你,感到不安。

1 个答案:

答案 0 :(得分:0)

查看http://scipy-cookbook.readthedocs.io/items/Matplotlib_Gridding_irregularly_spaced_data.html

我们的想法是使用griddata中的scipy.interpolate来获取规则间隔网格上不规则间隔的数据。

如果我假设您在numpy数组中有数据x, y, z,则可以修改文档中给出的示例:

# define grid.
xi = np.linspace(np.amin(x),np.amax(x),100)
yi = np.linspace(np.amin(y),np.amax(y),100)
# grid the data.
zi = griddata((x, y), z, (xi[None,:], yi[:,None]), method='cubic')
# contour the gridded data
CS = plt.contour(xi,yi,zi,15,linewidths=0.5,colors='k')
CS = plt.contourf(xi,yi,zi,15,cmap=plt.cm.jet)
plt.colorbar() # draw colorbar