2014-04-04 65 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 –