Обновите существующую легенду, которая содержит PolyCollection - PullRequest
0 голосов
/ 01 декабря 2018

Прежде чем перейти к проблеме 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 голосов
/ 01 декабря 2018

Вы не обновляете легенду.Вместо этого вы просто создаете его после своих графиков.

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()
...