2012-11-15 49 views
21

假設我有一個名爲ax的matplotlib軸,我想設置它的幾個屬性。目前,我這樣做:設置matplotlib figure/axes屬性的首選方法

ax.set_yscale('log') 
ax.set_xlim([0,10]) 
ax.set_xlabel('some label') 

但它過了一段時間變得乏味。然後我碰到這種方法:

ax.set(yscale='log', xlim=[0,10], xlabel='some label') 

更簡潔,但它似乎有點無證。我的意思是說所有的文檔都說「一個tkstyle設置命令,通過kwargs設置屬性」。

什麼是首選或習慣用法? set方法api是否穩定?

回答

14

Pyplot tutorial似乎推薦ax.set_xxx()功能,但也提到.setp(xxx=)

另一方面,.set(xxx=)功能沒有使用,.setp(xxx=)雖然有文件記載,但沒有在任何示例中使用(Pyplot API)。

我明白,matplotlib支持命令式編程風格和類似matlab的風格。成爲目標用戶羣的原因 - 那些已經熟悉Python和那些之前使用過Matlab的人。

我推斷matplotlib 推薦 api是.set_xxx()

快速檢查gallery證實了這一點。

除了命令式API不那麼明顯外,類似的二元性存在於關鍵字參數中以繪製函數。

+0

答案涵蓋了明顯的matplotlib api。我希望這兩個選項都可用並記錄在案。 –

+0

很好的答案,謝謝。不確定'setp(xxx = y)'或'set_xxx(y)'是否更「pythonic」,但都不完全是面向對象的方法;後者將上下遍歷matplotlib類實例的瘋狂層次結構,有時會默默地設置類屬性或用新的類實例替換簡單/數字輸入(例如在'set_xticklabels(y)'中傳遞'y'到'ticker .FixedFormatter(Y)')。兩者都只是面向對象的。 –

2

我通常使用matplotlib的pyplot(交互式)接口,它暴露了 setp函數(我經常使用它)。

matplotlib支持使用SETP的()(「設置屬性」),並getp()來 set和get對象的屬性,以及做 對象自省。

,它可以讓你做的事情就像你set功能上面,只傳遞給設置爲參數的對象:

>>> x = arange(0,1.0,0.01) 
>>> y1 = sin(2*pi*x) 
>>> y2 = sin(4*pi*x) 
>>> lines = plot(x, y1, x, y2) 
>>> setp(lines, linewidth=2, color='r') 

我猜setp功能實際上是調用傳遞的對象的set功能它可以定位和設置kwargs

所以我的想法是,儘管缺少文檔對象的set方法是通過kwargs而不是逐行設置多個參數的慣用方法。

我的2美分。

4

爲超級後期隨訪到這樣一個問題:

ax.set_xlim(4)ax.set(xlim=4)最終都是一樣的東西,所以做你喜歡的事情。 ax.set(kwarg=foo)通過一些字符串操作調用ax.set_kwarg(foo),正如你看到的源代碼一樣。各種設置功能大多也是單線程,但存在允許內省setp工作。

0

我與matplotlib後端有類似的問題,所以我剛碰到這個職位。我希望matplotlib將允許使用字典控制的屬性在一個情節。使用@Chris Zeh的建議,您可以:

f = {'xlabel': 'x1', 'ylabel': 'x2'} 
[setp(ax, formati, formatj) for formati, formatj in f.items()] 

解決了我的問題。希望這可以幫助。