2017-04-06 43 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

相关问题