2013-08-19 66 views
1

我想在等高線上繪製一個函數,該函數在單位正方形的4個頂點 處爲0,在該正方形的中間有1個頂點。我嘗試這樣做:Python/MatPlotLib產生奇怪的,意想不到的輪廓

import matplotlib.pyplot 
z = [[0,0,0], [1,0,0], [0,1,0], [1,1,0], [.5,.5,1]] 
cn = matplotlib.pyplot.contour(z) 
matplotlib.pyplot.show(cn) 

,並得到這樣的:

enter image description here

我期望的一系列同心正方形的,就像這樣:

enter image description here

這是我得到的時候我做

ListContourPlot[{{0,0,0}, {1,0,0}, {0,1,0}, {1,1,0}, {.5,.5,1}}, 
ColorFunction -> (Hue[#1]&)] 

在Mathematica中。

我做錯了什麼?

編輯:我意識到有多種方式繪製給定數據的輪廓。在這種情況下,一系列同心圓也會很好。

+1

我不明白你爲什麼會期望與你正在繪製的陣列同心環。如果你想在中間有一個零,那麼你肯定想要更類似這樣的東西:'z = np.array([[0,0,0],[0,1,0],[0,0, 0]])'。 –

回答

5

對於非網格數據,如評論所說,你可能想使用tricontour功能:

>>> import matplotlib.pyplot as plt 
>>> z = [[0,0,0], [1,0,0], [0,1,0], [1,1,0], [.5,.5,1]] 
>>> x, y, z = zip(*z) 
>>> cn = plt.tricontourf(x, y, z) 
>>> plt.show() 

output

HTH

+0

謝謝!我正在批准這個答案,因爲我確定它會 工作。不幸的是,我的matplotlib沒有tricontourf() 函數。我試圖升級到matplotlib 1.3.0,但這需要 和numpy 1.5,並且我嘗試升級numpy失敗,出現鏈接器 錯誤。 雖然我確信我可以最終得到這個工作,但我會去 尋求一種使用qhull的方法。 實際上,它看起來像scipy使用qhull的一些工作,無論如何,所以直接使用qhull應該有希望工作。 – barrycarter

4

的問題是,因爲預期輸入是完全不同的

mathematica ContourListPlot預計形式{x, y, z}點的名單(您呼叫的方式)。

matplotlib contour(您調用它的方式)期望值爲z的數組。

根據您的輸入,它會生成正確的輪廓。要清楚地看到這個,請看imshow(z)

+0

所以它期望的z值將應用於之前提供的x和y值的網格?這是否意味着,我不能使用諸如插值之類的東西給它任意的(非網格)x,y,z三元組? – barrycarter

+0

不允許使用三元組,如果要輪廓非網格化數據,則可能需要在mpl中尋找廣泛的三元組例程。三輪車是其中之一。 HTH – pelson