x-y 平面上的热图,以 z 为权重

Heatmap on x-y plane with z as weighting

我已经在这个论坛上浏览了数十个关于热图的答案,但我仍然 运行 遇到问题,所以我想问问自己。请记住,直到一个月前我才知道 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" 中有多个点,它会计算 "aggregate" 权重——例如如果在一个特定的 bin 中有两个数据点的权重分别为 1 和 2.5,则该 bin 将被着色,就好像它的权重是 1+2.5=3.5 一样。有什么办法可以让它显示与最接近 bin 中心的数据点的权重相对应的颜色?

例如如果权重为 2.5 的数据点非常靠近 bin 中心,而权重为 1 的数据点位于 bin 的边缘之一,有没有办法让 bin 的权重为 2.5?

谢谢,抱歉打扰了。

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

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

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

# 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