2014-07-11 195 views
1

我想繪製一些使用Matplotlib輪廓的點。繪製輪廓點 - Matplotlib/Python

我有我想要繪製輪廓的標量場。 然而,我的ndarray具有尺寸0×20,但我的真實空間變化從-4到4

我可以利用這段代碼繪製該輪廓:

x, y = numpy.mgrid[-4:4:20*1j, -4:4:20*1j] 

# Draw the scalar field level curves 
cs = plt.contour(scalar_field, extent=[-4, 4, -4, 4]) 
plt.clabel(cs, inline=1, fontsize=10) 

的問題是因爲我不得不在這個圖上繪製一些點,並且這些點是使用獲得的,也就是說,我得到的點隨着這個數組維數而變化。

我試圖繪製使用此代碼以下幾點:

def plot_singularities(x_dim, y_dim, steps, scalar_field, min_points, max_points, file_path): 
    """ 
    :param x_dim : the x dimension of the scalar field 
    :param y_dim : the y dimension of the scalar field 
    :param steps : the discretization of the scalar field 
    :param file_path : the path to save the data 
    :param scalar_field : the scalar_field to be plot 
    :param min_points : a set (x, y) of min points of the scalar field 
    :param max_points : a set (x, y) of max points of the scalar field 
    """ 
    min_points_x = min_points[0] 
    min_points_y = min_points[1] 
    max_points_x = max_points[0] 
    max_points_y = max_points[1] 

    plt.figure() 

    x, y = numpy.mgrid[-x_dim:x_dim:steps*1j, -y_dim:y_dim:steps*1j] 

    # Draw the scalar field level curves 
    cs = plt.contour(scalar_field, extent=[-x_dim, x_dim, -y_dim, y_dim]) 
    plt.clabel(cs, inline=1, fontsize=10) 

    # Draw the min points 
    plt.plot(min_points_x, min_points_y, 'ro') 

    # Draw the max points 
    plt.plot(max_points_x, max_points_y, 'bo') 

    plt.savefig(file_path + '.png', dpi=100) 
    plt.close() 

但我得到了這個形象:

enter image description here

這是不正確的。

如果我改變這一行:

cs = plt.contour(scalar_field, extent=[-x_dim, x_dim, -y_dim, y_dim]) 

對於一個:

cs = plt.contour(scalar_field) 

enter image description here

我獲得所需的行爲,但程​​度不顯示我的真實數據空間,但尺寸不同。

最後,如果我沒有描繪出這些點(評論情節()線),我可以的程度,我想:

enter image description here

但我要繪製點。 這兩個數據都在相同的空間。 但是輪廓()函數允許我指定網格。 我可以找到一種方式來繪製點時做到這一點。

我想知道如何正確設置範圍,因爲我想。

預先感謝您。

+0

這將有助於瞭解你的期望。 「數據空間」應該是什麼?點和輪廓都不正確,還是輪廓? – amd

+0

如果你看第二個圖像,它是正確的(圖)。但是將範圍顯示爲ndarray維度(從0到20)。我想顯示它不同於我的數據空間(中心在0,0和-4到4之間)。我把我的「數據空間」稱作CG圖像空間(ndarray)和世界空間(我的真實數據空間)的概念。 – pceccon

回答

2

如果不提供對應於該標量場xy數據,contour使用整數值到數組的大小。這就是爲什麼軸正在顯示數組的維數。參數extent應給出最小值和最大值xy值;我認爲這就是你所說的「數據空間」。「所以調用contour是:

contour(scalar_field,extent=[-4,4,-4,4]) 

這可以通過指定xy數據被複制:

contour(numpy.linspace(-4,4,20),numpy.linspace(-4,4,20),scalar_field) 

然後輪廓看上去完全按照你的第一個情節我假設的原因,這根據您提供的信息,這是因爲您傳遞給您的函數的min_pointsmax_points索引到數組scalar_field,因此最小和最大點不在正確的位置。所以它們對應於整數,而不是實際的xy值。嘗試使用這些指標通過定義訪問xy點:

x=numpy.linspace(-4,4,20) 
y=numpy.linspace(-4,4,20) 

舉例來說,如果你有一個分點的(0,1),這將對應於(x[0], y[1])。我認爲類似的事情可以用mgrid完成,但我從來沒有用過。

+0

不能說更好自己:) – Ajean

+0

謝謝!正如我剛纔寫給@Ajean的那樣,我知道這些都是指數,這就是問題所在(對不起,如果我不能以一種好的方式表達自己的話)。我正在尋找一種聰明的方式來在Matplolib/Python中進行這種轉換。非常感謝你! – pceccon

0

你想繪製輪廓和實際數據空間中的點,是嗎? plt.contour將採用與您所擁有的二維數組關聯的x和y值,並將正確地繪製在座標軸上。

xvals = -x_dim:x_dim:step # I'm not sure about these ... but you get the idea 
yvals = -y_dim:y_dim_step 
plt.contour(xvals, yvals, scalar_field) 
+0

如果我只是這樣做,我會得到第一個圖像,當我繪製點時,它不尊重我想要的空間。 – pceccon

+0

您確定您繪製的點位於正確的空間嗎?看起來你正在用一個東西和另一個索引來繪製實際值。 – Ajean

+0

他們都在同一個空間。繪製輪廓時,我將其範圍更改爲參數,但繪製點時我不知道如何操作。 – pceccon