2017-04-06 82 views
0

我想用一個新的替換matplotlib圖例,但保持被替換的圖例的相同(可能是任意的)位置。如何替換matplotlib圖例並保持相同的位置?

爲什麼以下代碼不起作用?

 
import matplotlib.pyplot as plt 

plt.plot(range(10)) 
ax = plt.gca() 

leg = plt.legend(['a'], loc='lower left') 
bb = leg.get_bbox_to_anchor().inverse_transformed(ax.transAxes) 

plt.legend(['b'], bbox_to_anchor=bb) 

回答

0

要回答這個問題,爲什麼在問題的代碼是行不通的:
圖例的位置僅在運行時,當確定數字繪製。另外,bbox_to_anchor沒有設置,所以它將是完整的軸((0,0,1,1))。

你可以做的是先畫在畫布上,然後獲取窗口程度

ax.figure.canvas.draw() 
bb = leg.get_window_extent().inverse_transformed(ax.transAxes) 

不過,這不會給你正確的位置(僅接近)。

現在一個可能的解決方案是不是要取代傳說,而是隻更新它的內容:

import matplotlib.pyplot as plt 

plt.plot(range(10)) 
ax = plt.gca() 

leg = plt.legend(['a'], loc='lower left') 

leg.texts[0].set_text("b") 

plt.show() 

否則,如果更新不是一個選項,你將需要bbox_to_anchor從組委會參數舊圖例:

import matplotlib.pyplot as plt 

plt.plot(range(10)) 
ax = plt.gca() 

leg = plt.legend(['a'], loc='lower left', bbox_to_anchor=(0.5,0.5)) 

bb = leg.get_bbox_to_anchor().inverse_transformed(ax.transAxes) 
plt.legend(['b'], bbox_to_anchor=bb, loc=leg._loc_real) 

plt.show() 

在模式已設置爲「展開」的情況下,這可能仍會失敗。當使用相同的fancybox參數來創建新的圖例時,它也是正確的。

+0

只更新內容將會很好。但是,我不認爲可以更新所需的所有屬性:字體大小,數字點,散點,標籤間距,處理文本框,borderaxespad,borderpad,handlelength和fancybox。我認爲其中的幾個只能通過創建時的圖例命令訪問。 – mrclary

+0

有沒有辦法確定傳說如何/在哪裏錨定?例如,圖例的左下角固定在軸的左下角。如果是這樣,那麼我可以設置'loc ='左下'... – mrclary

+0

我更新了答案。也許這更接近你所需要的。 – ImportanceOfBeingErnest

0

,除非我的誤解,只是做:

import matplotlib.pyplot as plt 

plt.plot(range(10)) 
ax = plt.gca() 

location = 'lower left' 

while 1: 

    plt.legend(['a'], loc=location) 
    plt.pause(1) 
    plt.legend(['b'], loc=location) 
    plt.pause(1) 
+0

我應該澄清,原來的傳說位置是不知道的,除了可能是任意的。例如,如果數字是從pickle文件加載的,就會發生這種情況。 – mrclary

相關問題