回答问题中的代码为什么不起作用的问题:
图例的位置仅在绘制图形时在运行时确定。此外,未设置 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 和 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 参数来创建新图例时,它也是准确的。