python 如何替换matplotlib图例并保持位置不变?

mec1mxoz  于 2022-10-30  发布在  Python
关注(0)|答案(2)|浏览(156)

我想用一个新的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)
pgccezyw

pgccezyw1#

若要回答问题中的程式码为何无法运作的问题:
图例的位置仅在绘制图形时在运行时确定。此外,未设置bbox_to_锚,因此它将是完整的轴((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_锚和loc参数:

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参数创建新图例时才是准确的。

mpgws1up

mpgws1up2#

除非我误会了,否则就这么做吧:

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)

相关问题