更新包含PolyCollection的现有图例

时间:2018-12-01 03:18:29

标签: python python-3.x matplotlib legend

在讨论PolyCollection问题之前,我已经很好奇通常是否有一种简洁的方法可以将新元素添加到现有图例中。例如:

import matplotlib.pyplot as plt

f, ax = plt.subplots()
ax.legend(handles=ax.plot([0, 1], [0, 1], '-', label='foo'))
p, = ax.plot([1, 2], [1, 2], '--o', label='bar')

现在,我想将p添加到现有图例ax.get_legend()中。我发现我可以做(尽管不是真的更新):

ax.legend(handles=ax.get_legend().legendHandles + [p])

我觉得应该有一个更清洁的方法。是吗?

Example 1

但是,如果图例包含PolyCollection,则相应的标签会丢失:

ax.legend(handles=[ax.fill_between([0, 1], 0, 1, color='green', label='foo')])
p = ax.fill_between([1, 2], 0, 1, color='orange', label='bar')
ax.legend(handles=ax.get_legend().legendHandles + [p])

Example 2

现在,我正在寻找一种方法来检索存储在图例中的标签,但是没有运气,dir(ax.get_legend())并没有提供任何有用的信息。有趣的是,相应的handle也不知道其标签(尽管对于第一个示例中的plot来说也是这样):

ax.get_legend().legendHandles[0].get_label()  # Empty string.

所以我想知道图例怎么知道哪个标签对应于该句柄;它必须存储在图例对象内的某个位置。

还有我的中心问题:如何在不丢失任何先前信息的情况下,用新项目更新现有图例?

1 个答案:

答案 0 :(得分:1)

您不更新图例。相反,您只是在绘图后创建它。

import matplotlib.pyplot as plt

fig, ax = plt.subplots()

p1 = ax.fill_between([0, 1], 0, 1, color='green', label='foo')
p2 = ax.fill_between([1, 2], 0, 1, color='orange', label='bar')

ax.legend()

plt.show()

如果碰巧后来创建了一个图(例如通过交互使用或动画),您仍然只需再次调用legend

import matplotlib.pyplot as plt

fig, ax = plt.subplots()

p1 = ax.fill_between([0, 1], 0, 1, color='green', label='foo')
ax.legend()

p2 = ax.fill_between([1, 2], 0, 1, color='orange', label='bar')
ax.legend()

plt.show()