2014-02-13 92 views
2

我有幾個批量多測量在陣列中,像這樣:如何從MatPlotLib(NumPy)中的多維數據繪製輪廓?

m = array([[2, 1, 3, 2, 1, 4, 2], # measurements for quantity A 
[8, 7, 6, 7, 5, 6, 8], # measurements for quantity B 
[0, 1, 2, 0, 3, 2, 1], # measurements for quantity C 
[5, 6, 7, 5, 6, 5, 7]] # measurements for quantity D 
) 

的數量是相關的,我需要繪製各種等值線圖。像「B與D x A的輪廓」一樣。

的確,在一般情況下的功能可能沒有很好地定義 - 例如在上述數據,列0和3示出,對於相同的(D=5,A=2)點存在用於B(B=8B=7兩個不同的值)。但是,對於某些組合,我知道有一個功能依賴,我需要繪製。

MatPlotLib中的contour()函數需要三個數組:X和Y可以是一維數組,而Z必須是具有相應值的二維數組。我應該如何從m準備/提取這些數組?

回答

2

您可能會想要使用類似scipy.interpolate.griddata的東西來準備您的Z陣列。這會將您的數據內插到一個規則間隔的二維數組中,給定您的輸入X和Y,以及一組排序的,間隔規則的X和Y陣列,您將需要進行最終的繪圖。例如,如果X和Y包含1到10之間的數據點,那麼您需要構建一組新的X和Y,其步長對您的數據有意義。

Xout = numpy.linspace(1,10,10) 
Yout = numpy.linspace(1,10,10) 

要打開你讓Xout和YOUT陣列到二維數組,你可以使用numpy.meshgrid,例如

Xout_2d, Yout_2d = numpy.meshgrid(Xout,Yout) 

然後,您可以使用這些新的規則間隔陣列來構建您可以用於繪圖的插值Z數組,例如,

Zout = scipy.interpolate.griddata((X,Y),Z,(Xout_2d,Yout_2d)) 

這個內插的2D Zout應該可用於Xout_2d和Yout_2d的輪廓圖。

提取您的陣列從m是簡單,你只要做這樣的事情:

A, B, C, D = (row for row in m) 
+0

@Amenhotep我擴大了我原來的答覆就如何meshgrid和工作的GridData一個簡單的例子來給你一個新款Z是您可以使用輪廓繪圖 – pseudocubic

+0

它完美無缺地工作!謝謝!你救了我的一天! – Amenhotep