2017-04-03 78 views
2

對於迄今爲止所見的所有類型地塊,matplotlib將自動將它們居中,當沒有給出xlim(), ylim()值時。例如:Matplotlib將不會顯示默認居中的多邊形圖?

import matplotlib.pyplot as plt 
A_pts = [(162.5, 137.5), (211.0, 158.3), (89.6, 133.7)] 
ax = plt.subplot(111) 
ax.scatter(*A_pts) 
plt.show() 

enter image description here

但是,當我繪製Polygon

ax = plt.subplot(111) 
triangle = plt.Polygon(A_pts, fill=None, edgecolor='r') 
ax.add_patch(triangle) 
plt.show() 

被示爲具有兩個軸,這導致在該多邊形不可見範圍[0, 1]圖表窗口。我要明確地傳遞適當的限制,使其在圖形窗口

ax.set_xlim(80, 250) 
ax.set_ylim(120, 170) 

表明這是通過設計還是我失去了一些東西?

+0

你試過'ax.relim()'和'ax.autoscale_view()'(從[這裏](http://stackoverflow.com/a/11039268/3026320)) ?我的意思是,它可能是設計,是一種更「基本」的繪製圖表數據的方式。 – berna1111

+1

我知道有方法可以將限制傳遞給情節,我想知道爲什麼'matplotlib'在默認情況下不會爲這種類型的情節做這件事(當然我可以告訴)所有其他類型。 – Gabriel

+2

我認爲這是設計,因爲'add_patch'不是一個真正的繪圖功能,而是一個藝術家控制功能。像'scatter'這樣的東西實際上會讓你從傳入的數據中創造藝術家 - 'add_patch'不會讓藝術家成爲藝術家,它只是將其放入Axes對象中。 – Ajean

回答

4

它是由設計。諸如plotscatter之類的東西是繪圖功能,它們可以接收數據,創建藝術家並形成繪圖/調整座標軸。另一方面,它更多地是一種藝術家控制方法(它不會創造藝術家,藝術家本身也會通過)。正如Paul H的評論中所述,它處於公共API的最低級別,在此級別上,假設您完全控制了該數字。

+0

什麼是API的*級別*?什麼使某些命令成爲特定級別的一部分? – ImportanceOfBeingErnest

+0

我不太清楚你要做什麼 - 程序員應該理解「低級」與「高級」。「我不是一個matplotlib開發者,所以我不能完全列出*他們是如何構建他們所有的代碼庫的,但是我也懷疑這不是你真正想要的,因此你給出了一個非常好的答案,這個評論對我來說過於沉悶 - 請告訴我,如果不是這樣的話,爲了您的利益,我也更加明確了我在評論中引用的所有內容 – Ajean

+0

所以我想知道你是否(或者相當@PaulH)擁有任何理由把matplotlib API分成不同的級別,在我看代碼的時候,以及'add_patch'這個文檔和'plot'在同一層(不管是什麼),或者換句話說, x',什麼決定它的水平?(我知道這可能會離原來的問題有點遠,所以你不需要回應它,我只是好奇而已;-)) – ImportanceOfBeingErnest

4

添加補丁時,會更改軸的數據限制,您可以通過打印ax.dataLim.bounds來查看。但是,add_patch不會調用automlimits函數,而其他大多數繪圖命令都會這樣做。

這意味着您可以手動設置繪圖極限(如問題所示),也可以撥打ax.autoscale_view()來調整極限。後者當然具有這樣的優點,即您不需要事先確定限制並保留邊際。

import matplotlib.pyplot as plt 
pts = [(162, 137), (211, 158), (89, 133)] 
ax = plt.subplot(111) 
triangle = plt.Polygon(pts, fill=None, edgecolor='r') 
ax.add_patch(triangle) 
print ax.dataLim.bounds 

ax.autoscale_view() 
plt.show() 

一旦你會添加一些其他的曲線圖,並自動縮放的限制,也沒有必要調用autoscale_view()了。

import matplotlib.pyplot as plt 
pts = [(162, 137), (211, 158), (89, 133)] 
ax = plt.subplot(111) 
triangle = plt.Polygon(pts, fill=None, edgecolor='r') 
ax.add_patch(triangle) 

ax.plot([100,151,200,100], [124,135,128,124]) 

plt.show() 

enter image description here