2011-10-29 37 views
12

我正在嘗試右對齊matplotlib軸圖例中的條目(默認情況下它們是左對齊的),但似乎無法找到任何這樣做的方法。設置餘有低於:Matplotlib圖例中的文本對齊

(我已經加入數據和標籤my_fig使用ax.plot()命令軸)

ax = my_fig.get_axes()[0] 
legend_font = FontProperties(size=10) 
ax.legend(prop=legend_font, num_points=1, markerscale=0.5) 

有的圖例關鍵字參數在docs爲matplotlib Axes列表,但似乎沒有任何直接的方法來設置圖例條目的對齊方式。有誰知道這樣做的後門方式?謝謝。

編輯:

爲了澄清什麼,我想實現的,現在我的傳說是這樣的:

Maneuver: 12-OCT-2011 12:00 UTC 

Bias: 14-OCT-2011 06:00 UTC 

我希望它看起來像:

Maneuver: 12-OCT-2011 12:00 UTC 

    Bias: 14-OCT-2011 06:00 UTC 
+1

貴標籤的文本包括多行?如果是這樣,你可以使用label_text.set_multialignment('right') –

+0

不知道我明白你的意思。對於標籤,我有一個簡要的描述和日期。所以現在,這個圖例的描述在左邊堆疊並對齊,我想要的是將所有日期堆疊起來(在右邊對齊)。我用插圖編輯了我的主要信息。 – jeremiahbuddha

+0

作爲一種解決方法,您可以用空格填充它們(假設您使用等寬字體) –

回答

15

你正在尋找的後門是:

# get the width of your widest label, since every label will need 
# to shift by this amount after we align to the right 
shift = max([t.get_window_extent().width for t in legend.get_texts()]) 
for t in legend.get_texts(): 
    t.set_ha('right') # ha is alias for horizontalalignment 
    t.set_position((shift,0)) 
+2

喊出來!剛剛意識到你是我在今年PyCon IPython sprint會見的保羅。我終於開始編碼這個答案,謝謝! – jeremiahbuddha

8

我試圖得到的例子工作,但我不能。

至少自matplotlib版本1.1.1(也許更早)以來,我們需要一個專用的渲染器實例。 照顧您定義渲染器的後端。取決於後端,輸出可能在屏幕上看起來很好,但與PDF一樣糟糕。

# get the width of your widest label, since every label will need 
#to shift by this amount after we align to the right 
renderer = figure.canvas.get_renderer() 
shift = max([t.get_window_extent(renderer).width for t in legend.get_texts()]) 
for t in legend.get_texts(): 
    t.set_ha('right') # ha is alias for horizontalalignment 
    t.set_position((shift,0))