如何替换 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 图例并保持相同的位置?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 matplotlib 中更改图例字体名称

如何使用 matplotlib 为许多子图制作一个图例?

Python - 如何隐藏标签并保留图例 matplotlib?

matplotlib:两个数据集的相同图例

如何在直方图的 matplotlib 图例中制作线条而不是框/矩形

Matplotlib - 全局图例和标题旁边的子图