如何替换 matplotlib 图例并保持相同的位置?
Posted
技术标签:
【中文标题】如何替换 matplotlib 图例并保持相同的位置?【英文标题】:How to replace matplotlib legend and keep same location? 【发布时间】:2017-09-02 03:49:50 【问题描述】:我想用一个新的图例替换一个 matplotlib 图例,但要保持被替换图例的相同(可能是任意的)位置。
为什么下面的代码不起作用?
将 matplotlib.pyplot 导入为 plt plt.plot(范围(10)) 斧头 = plt.gca() leg = plt.legend(['a'], loc='左下') bb = leg.get_bbox_to_anchor().inverse_transformed(ax.transAxes) plt.legend(['b'], bbox_to_anchor=bb)【问题讨论】:
【参考方案1】:回答问题中的代码为什么不起作用的问题:
图例的位置仅在绘制图形时在运行时确定。此外,未设置 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 参数来创建新图例时,它也是准确的。
【讨论】:
更新内容就好了。但是,我认为不可能更新我需要的所有属性:fontsize、numpoints、scatterpoints、labelspacing、handletextpad、borderaxespad、borderpad、handlelength 和 fancybox。我认为其中一些只能通过创建时的 legend 命令访问。 有没有办法确定图例的锚定方式/位置?例如,图例的左下角锚定到轴的左下角。如果是这样,那么我可以设置loc='lower left'
...
我更新了答案。也许这更接近您的需要。
_loc_real
正是我所需要的!你知道_loc_real
和_loc
有什么区别吗?
一个比另一个更真实。 ;-) 不,老实说,我现在不知道。【参考方案2】:
除非我有误解,否则就这样做:
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)
【讨论】:
我应该澄清原始图例位置未知,除了可能是任意的。例如,如果图形是从 pickle 文件加载的,就会发生这种情况。以上是关于如何替换 matplotlib 图例并保持相同的位置?的主要内容,如果未能解决你的问题,请参考以下文章
Python - 如何隐藏标签并保留图例 matplotlib?