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

sma*_*rld 4 python visualization numpy matplotlib

我有一个功能returnValuesAtTime是返回三个lists- x_vals,y_valsswe_vals.所有三个列表具有相同的长度,并且每个元素swe_vals对应于x-valuefrom x_valsy-valuefrom 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()
Run Code Online (Sandbox Code Playgroud)

一旦使用所获得的三个列表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]
Run Code Online (Sandbox Code Playgroud)

编辑:

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

在此输入图像描述

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

在此输入图像描述

在示例图中,所有z值都相同.因此整个网格空间的颜色相同.

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

在此输入图像描述

CT *_*Zhu 5

它看起来像如果重塑x,y,z对方阵,你可以做一个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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述