【问题标题】:Generating a heat map using 3D data in matplotlib在 matplotlib 中使用 3D 数据生成热图
【发布时间】:2014-05-17 07:31:59
【问题描述】:

我有一个函数returnValuesAtTime,它返回三个列表-x_valsy_valsswe_vals。所有三个列表的长度相同,swe_vals 中的每个元素对应于来自x_valsx-value 和来自y_valsy-value。我希望生成一个带有图例的热图,该图例使用(x,y) 坐标和swe_vals 作为强度。

我写了以下代码:

def plotValuesAtTimeMap(t):
    x_vals,y_vals,swe_vals=returnValuesAtTime(t)
    x_points=len(x_vals)
    y_points=len(y_vals)
    xx=np.linspace(x_vals[0],x_vals[-1],x_points)
    yy=np.linspace(y_vals[0],y_vals[-1],y_points)
    fig,ax=plt.subplots()
    im=ax.pcolormesh(xx,yy,z)
    fig.colorbar(im)
    ax.axis('tight')
    plt.show()

一旦使用returnValuesAtTime(t) 获得这三个列表,我将采用x_valsy_vals 的长度。然后我使用这些来生成 x 和 y 方向的间距,限制是 x_valsy_vals 的第一个和最后一个元素。然后我尝试生成colormesh。但这给了我一个空的 colormesh 没有值。

可能出了什么问题?使用 3D numpy 数组而不是三个列表会解决问题吗?

每个列表的前 10 个元素是:

x_vals[0:10]

[439936.86573189893,
 439936.86573189893,
 439936.86573189893,
 439936.86573189893,
 439936.86573189893,
 439936.86573189893,
 439936.86573189893,
 439936.86573189893,
 439936.86573189893,
 439936.86573189893]

y_vals[0:10]

[4514018.2797159087,
 4513898.2797159087,
 4513778.2797159087,
 4513658.2797159087,
 4513538.2797159087,
 4513418.2797159087,
 4513298.2797159087,
 4513178.2797159087,
 4513058.2797159087,
 4512938.2797159087]

swe_vals[0:10]

[2.7520323,
 2.7456229,
 2.7456021,
 2.745455,
 2.7478349,
 2.7445269,
 2.7484877,
 2.7524617,
 2.75491,
 2.7509627]

编辑

我添加了一个散点图,显示下面的 (x,y) 网格范围:

x 和 y 值在列表中,每个长度为 6804。每个 (x,y) 点在一个单独的列表中都有一个对应的 z 值,该列表的长度也是 6804。为了阐明我希望实现的目标,我想生成一个类似于图的热图,其中 z 轴的大小由图上每个网格的颜色表示。如下所示:

在示例图中,所有 z 值都相同。所以整个网格空间的颜色都是一样的。

编辑了新的结果图(基于成员 CT Zhu 的建议):

【问题讨论】:

  • 可以安全地假设您的x_valsy_vals 分布不均,例如1,2,3,4,....?很可能是的,因为您有一行 xx=np.linspace(x_vals[0],x_vals[-1],x_points)?
  • @ CTZHU它们是均匀分布的,具有X_VALS的前三个元素是[439936.8657319,440056.8657319,440176.8657319,440176.8657319,440176.8657319]和Y_VALS的前三个元素是[4514018.27971591,4513898.27971591,4513778.27971591]。 x_vals 中的每个元素都比前一个多 120.0,y_vals 中的每个元素都比前一个少 120.0。
  • 我明白了,就像meshgrid出来的一样

标签: python numpy matplotlib visualization


【解决方案1】:

看起来如果将xyz 重塑为方阵,你可以做一个contourf 绘图:

In [7]:X
Out[7]:
array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
       [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
       [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
       [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
       [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
       [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
       [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
       [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
       [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
       [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])

In [8]:Y
Out[8]:
array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
       [2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
       [3, 3, 3, 3, 3, 3, 3, 3, 3, 3],
       [4, 4, 4, 4, 4, 4, 4, 4, 4, 4],
       [5, 5, 5, 5, 5, 5, 5, 5, 5, 5],
       [6, 6, 6, 6, 6, 6, 6, 6, 6, 6],
       [7, 7, 7, 7, 7, 7, 7, 7, 7, 7],
       [8, 8, 8, 8, 8, 8, 8, 8, 8, 8],
       [9, 9, 9, 9, 9, 9, 9, 9, 9, 9]])

plt.contourf(X,Y,np.random.random((10,10))) #reshape Z too!
plt.colorbar()

【讨论】:

  • 矩阵和数组有具体的区别吗?我有另一个函数,它返回一个包含 x 坐标、y 坐标和 z 值 (swe_vals) 的 3D numpy 数组。函数是: def createArray(t): x_vals,y_vals,swe_vals=returnValuesAtTime(t) swe_array=np.array([x_vals,y_vals,swe_vals],np.float32) return swe_array 。有没有办法可以将其转换为矩阵并生成图表?
  • 我的每个列表(x、y 和 z)都有 6804 个值。是否可以将其转换为方阵?我尝试了多种方法,但似乎都没有。
  • 如果您制作xy 的散点图,它看起来是一个均匀分布的方格吗? 6804有点奇怪,不会变成方阵,82*83=8606
  • 我在问题编辑中添加了一些示例图。 6804不会变成方阵。
  • 看来你的网格确实是84*81的,可以len(set(x_vals))验证吗?如果网格是 84*81,您可以按照说明制作热图,但将数据重塑为 (84,81) 而不是方阵。
猜你喜欢
  • 2017-08-06
  • 2011-01-23
  • 1970-01-01
  • 1970-01-01
  • 2012-12-09
  • 2017-04-12
  • 2017-10-15
  • 2023-04-01
  • 2013-07-19
相关资源
最近更新 更多