在matplotlib中使用3D数据生成热图

5 投票
1 回答
9247 浏览
提问于 2025-04-18 01:24

我有一个函数 returnValuesAtTime,它会返回三个列表——x_valsy_valsswe_vals。这三个列表的长度是一样的,每个 swe_vals 中的元素都对应着 x_vals 中的一个值和 y_vals 中的一个值。我想用这些 (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) 的网格范围:

enter image description here

x 和 y 的值在列表中,每个列表的长度都是 6804。每个 (x,y) 点都有一个对应的 z 值,这个 z 值也在一个单独的列表中,长度同样是 6804。为了更清楚我想要实现的效果,我希望生成一个热图,图中每个网格的颜色代表 z 轴的大小。就像下面显示的那样:

enter image description here

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

根据成员 CT Zhu 的建议,编辑了新的结果图:

enter image description here

1 个回答

6

看起来如果把 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()

enter image description here

撰写回答