2014-04-04 30 views
4

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

我写以下代码:

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值,其长度也是6804。为了阐明我希望实现的目标,我想生成一个热图,如图中的每个网格颜色所表示的z轴大小。类似下面清单所示:

enter image description here

在这个例子中的情节,所有的Z值是相同的。所以整个网格空间的颜色是相同的。

与新产生的剧情编辑(基于成员CT朱的建议):

enter image description here

+0

假设你的'x_vals'和'y_vals'不是均匀分布的,比如'1,2,3,4,....'安全吗?很可能是的,因为你有一行'xx = np.linspace(x_vals [0],x_vals [-1],x_points)'? –

+0

@CTZhu它们均匀分布,其中x_vals的前三个元素为[439936.8657319,440056.8657319,440176.8657319],y_vals的前三个元素为[4514018.27971591,4513898.27971591,4513778.27971591]。 x_vals中的每个元素比前一个元素多120.0,并且y_vals中的每个元素都是120。比以前少了0个。 –

+0

我看到了,就像'meshgrid'出来的那样 –

回答

5

它看起来像如果重塑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

+0

矩阵和数组之间有特定的区别吗?我有另一个函数返回一个包含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) 返回swe_array 。 有没有一种方法可以将其转换为矩阵并生成图形? –

+0

我的每个列表(x,y和z)都有6804个值。有可能将其转换为方矩阵吗?我尝试了多种方法,但他们都没有效果。 –

+0

如果您制作'x'和'y'的散点图,它看起来是均匀分布的方形网格吗? 6804有点奇怪,不会成为方阵,82 * 83 = 8606 –