【问题标题】:Python heatmap from 3d coordinates来自 3d 坐标的 Python 热图
【发布时间】:2013-08-29 05:08:56
【问题描述】:

我从两个 linspaces 开始,然后对它们进行网格网格化。然后我在网格上计算一个函数的值。我的函数名为cpt_hcpv()。然后我想对我的数据进行热图,网格上的每个点都有对应的函数值。

代码看起来像

poro = np.linspace(min(poro), max(poro))
sw = np.linspace(min(sw), max(sw))

g = np.meshgrid(poro, sw)
points = zip(*(x.flat for x in g))

hcpv = []
for p in points:
    hcpv = hcpv + [cpt_hcpv(p[0], p[1], poro, sw)]

def cpt_hcpv(pCut, sCut, poro, sw):
    #find points belonging to calculation
    truncated = [(p, s) for p, s in zip(poro, sw) if p > pCut and s < sCut ]
    hcv = 0
    for k in truncated:
        hcv += p*(1-s)*0.5
    return hcv

为什么我不在网格上直接计算cpt_hcpv():因为我必须在理解truncated = [(p, s) for p, s in zip(poro, sw) if p &gt; pCut and s &lt; sCut ] 中处理条件,所以我必须在网格中的点上进行迭代。 我不知道如何迭代网格。

所以,我想从 3d 坐标绘制热图:在 points 我有 x 和 y 作为点,在 hcpv 我有 z每个点的参数,顺序相同。

从我发现的示例中,有 pylab 和 matplotlib 解决方案可以从网格网格 + 网格上计算的值绘制热图,方法以网格网格为参数。

有没有办法从 3d 坐标绘制热图?

【问题讨论】:

  • pcolorpcolormesh ?
  • 感谢您的提示。您是否有使用这些的带有 3d 坐标到热图的代码示例?再次感谢
  • 您的数据不是 3d。您有一个二维数组,您可以在其中计算函数,数组中的每个点都有一个对应的 x、y 坐标。所以这与available demonstrations 完全相同。如果您有三个定义 n 个点的 1d 数组 x、y 和 z,那将是 3d。

标签: python matplotlib plot heatmap


【解决方案1】:

如果您需要遍历网格,试试这个:

g = np.meshgrid(poro, sw)

#Turn into 2x3x3 array
g_arr = np.array(g)                            

#Move first dimension to third: 3x3x2 array
g_arr = g_arr.swapaxes(0,1).swapaxes(1,2)

#Generate results by iterating over first and second dimension, and unpacking the third
hcpv = np.array([[cpt_hcpv(p, s, poro, sw) for p,s in r] for r in g_arr])

我不知道 matplotlib 是否会从通用 3-d 点轻松绘制热图。它必须处理分散、无序和缺失点的一般情况。

【讨论】:

  • 感谢迭代解决方案。但是,当我 pylab.imshow(hcpv) 时,这似乎不起作用
  • 实际上您的解决方案与我的解决方案等效,我在网格中的点上获得了函数的值。然后我不知道如何绘图。但感谢您在网格上迭代的解决方案。
【解决方案2】:

我使用 DrRobotNinja 方法提出了这个解决方案

g = np.meshgrid(poro_g, sw_g)
g_arr = np.array(g)                            
g_arr = g_arr.swapaxes(0,1).swapaxes(1,2)

#I compute z value on the grid, `g_arr`
hcpv = np.array([[cpt_hcpv(p, s, poro, sw) for p,s in r] for r in g_arr])

我将热图和轮廓(级别)叠加

#heatmap
im = plt.imshow(hcpv, origin='lower',extent=[min(poro)-EPS,max(poro)
                                    +EPS,min(sw)-EPS,max(sw)+EPS],aspect='auto')

#contours
levels = np.array([p10,p50,p90])
cset = plt.contour(hcpv,levels,linewidths=2,cmap=pylab.cm.hot, 
      origin='lower',extent=[min(poro),max(poro),min(sw),max(sw)],aspect='auto')
plt.clabel(cset,inline=True,fmt='%1.1f',fontsize=20)

并显示

plt.show()

【讨论】:

    猜你喜欢
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多