【问题标题】:Matplotlib heatmap with changing y-valuesy 值变化的 Matplotlib 热图
【发布时间】:2013-11-03 13:01:34
【问题描述】:

我正在尝试为从两个表面之间进行的测量绘制一些数据。系统中的 z 方向定义为垂直于表面。问题是,沿着我的绘图的 x 轴,我正在改变两个表面之间的间距,这意味着对于每个切片,y 轴的最小值/最大值都会发生变化。我通过呈现一个归一化的 y 轴来规避这个问题,其中 z_min 是底面,z_max 是顶面:

但是,这种表示在某种程度上扭曲了数据。理想情况下,我想在 y 轴上显示到墙壁的实际距离,并将系统边界之外的区域留白。我(糟糕地)勾勒了我在这里的设想(当然,热图上的实际分布应该看起来不同):

我可以很容易地绘制出我想要的 3D 散点图,如下所示:

但是如何将数据转换为热图的可绘图形式?

我猜我必须炸毁 MxN 数组并通过插值填充缺失值,或者只是将它们标记为 NAN?但是我也不太清楚如何在我的配色方案中添加硬截止以使系统之外的所有内容都变为白色。

【问题讨论】:

  • 我知道这是一个老问题,但你能把你的代码用来生成这个“非常简单”的散点图吗?这正是我现在所需要的。谢谢!
  • 我现在找不到确切的代码,但这是一个 3D 散点图。有几个这样的教程:matplotlib.org/examples/mplot3d/scatter3d_demo.html

标签: python matplotlib heatmap


【解决方案1】:

您可以使用pcolormesh 来做到这一点,它将四边形的角作为参数

X, Y = np.meshgrid(np.linspace(0, 10, 100), np.linspace(0, 2*np.pi, 150),)
h = np.sin(Y)
Y *= np.linspace(.5, 1, 100)

fig, ax = plt.subplots(1, 1)
ax.pcolormesh(X, Y, h)

【讨论】:

  • 这看起来很有用,但我不能让它工作。我认为问题在于我拥有数据的 z 值集在每次分离时都不同。对于每个分离距离,我在 z 值 linspace(z_min, z_max, 100) 处收集数据。除了改变我收集数据的方式之外,还有什么规避这个问题的建议吗?
  • 在这种情况下,我的 Y 映射到您的 z
【解决方案2】:

下面是基于 CT Zhu 示例的三角形网格轮廓实现。

如果您的域不是凸的,则需要为三角剖分提供自己的三角形,因为默认的 Delaunay 三角剖分会根据您的点对凸包进行网格划分。

import matplotlib
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.tri as mtri


y = np.array([np.linspace(-i, i, 51) for i in (
              np.linspace(5, 10))[::-1]])
x = (np.zeros((50, 51)) +
     np.linspace(1, 6, 50)[..., np.newaxis])
z = (np.zeros((50, 51)) -
     np.linspace(-5, 5, 51)**2 + 10)  # make up some z data

x = x.flatten()
y = y.flatten()
z = z.flatten()

print "x shape: ", x.shape

triang = mtri.Triangulation(x, y)
plt.tricontourf(triang, z)
plt.colorbar()
plt.show()

【讨论】:

    【解决方案3】:

    我猜,也许使用griddata 的二维插值会是你想要的?

    from matplotlib.mlab import griddata
    xi=linspace(1,5,100)
    yi=linspace(-10.5, 10.5, 100)
    y=array([linspace(-i, i, 51) for i in (linspace(5,10))[::-1]]) #make up some y vectors with different range
    x=zeros((50,51))+linspace(1,6, 50)[...,newaxis]
    z=zeros((50,51))-linspace(-5, 5,51)**2+10 #make up some z data
    x=x.flatten()
    y=y.flatten()
    z=z.flatten()
    zi=griddata(x, y, z, xi, yi)
    plt.contourf(xi, yi, zi, levels=-linspace(-5, 5,51)**2+10)
    

    【讨论】:

      猜你喜欢
      • 2021-01-14
      • 1970-01-01
      • 2019-07-20
      • 1970-01-01
      • 1970-01-01
      • 2014-03-31
      • 1970-01-01
      • 2020-02-21
      • 2014-05-07
      相关资源
      最近更新 更多