2013-09-16 30 views
5

問題:matplotlib的輪廓期望輸入2D數組的順序是什麼?matplotlib輪廓輸入數組順序

精心:Matplotlib輪廓文件說,日常通話

x_axis = np.linspace(10,100,n_x) 
y_axis = np.linspace(10,100,n_y) 
matplotlib.pyplot.contour(x_axis, y_axis, scalar_field) 

凡scalar_field必須是一個二維數組。例如,可以通過

scalar_field = np.array([(x*y) for x in x_axis for y in y_axis]) 
scalar_field = scalar_field.reshape(n_x, n_y) 

生成scalar_field如果scalar_field給予輪廓,

plt.contour(x_axis, y_axis,scalar_field) #incorrect 

圖的取向不正確(旋轉)。要恢復正確的方向scalar_field必須調換:

plt.contour(x_axis, y_axis,scalar_field.transpose()) #correct 

那麼,什麼是爲了使輪廓預計scalar_field了?

回答

5

您應該繪製使用contour傳球也2- d陣列爲XY,然後在scalar_field陣列中的每個點將對應於座標(x, y) in X and Y。您可以使用numpy.meshgrid方便地創建XY

import matplotlib.pyplot as plt 
import numpy as np 

X, Y = np.meshgrid(x_axis, y_axis, copy=False, indexing='xy') 
plt.contour(X, Y, scalar_field)  

的參數indexing可以更改爲'ij'如果希望x座標來表示線和y代表列,但在這種情況下scalar_fied必須使用ij計算索引。

+0

請您詳細說明索引部分和順序嗎? – Ivan

+0

@Ivan當你使用''xy''索引時,你可以想象你從上面看矩陣,x座標從左到右,而y座標從底部到頂部。這不是你想要的,所以你可以選擇'ij''索引,其中第一個索引可以看作是行,第二個索引可以看作是列... –

2

x值預計對應於列中的數據的,而不是行(即,x是水平軸和y是垂直軸)。您已將其顛倒過來,這就是爲什麼您必須轉置z值才能使其正常工作。

爲了避免需要轉置,創建你陣列:

scalar_field = np.array([(x*y) for y in y_axis for x in x_axis]) 
scalar_field = scalar_field.reshape(n_y, n_x) 
+0

你能解釋一下它在說什麼你說關於X和Y的文件? – Ivan

+0

matplotlib 1.2.1的'contour' doc字符串表示「* X *和* Y *必須都是與* Z *形狀相同的2-D,或者它們必須都是1-D,這樣len( X)''是* Z *中的列數,''len(Y)''是* Z *中的行數。「 – bogatron

+0

是的,但這正是我的問題:len(x)是_first_索引,因此重塑必須遵守,因此正確的答案是重塑(n_x,n_y),而不是相反。這就是爲什麼混亂。 – Ivan