Добавить элемент в существующую легенду Matplotlib - PullRequest
1 голос
/ 29 апреля 2019

При следующих настройках:

from matplotlib import pyplot as plt
fig, ax = plt.subplots()
ax.plot([0,1,2,3,4,5,6], label='linear')
ax.plot([0,1,4,9,16,25,36], label='square')
lgd = ax.legend(loc='lower right')

Если функция add_patch получает только lgd в качестве аргумента, можно ли добавить элемент пользовательской легенды в легенду поверх существующих элементов безизменить другие свойства легенды?

Мне удалось добавить элемент, используя:

def add_patch(legend):
    from matplotlib.patches import Patch
    ax = legend.axes
    handles, labels = ax.get_legend_handles_labels()
    handles.append(Patch(facecolor='orange', edgecolor='r'))
    labels.append("Color Patch")
    ax.legend(handles=handles, labels=labels)

Но это не сохраняет свойства легенды, например, местоположение.Как я могу добавить элемент только с легендарным объектом после построения линий?

Ответы [ 2 ]

1 голос
/ 29 апреля 2019

В принципе, легенда не предназначена для обновления, но вместо этого воссоздана.

Следующее будет делать то, что вам нужно, но имейте в виду, что это хак, который использует внутренние методы и, следовательно, не гарантированно работает и может сломаться в будущих выпусках.Так что не используйте его в производственном коде.Кроме того, если вы установили заголовок легенды с другим шрифтом (размером), чем по умолчанию, он будет потерян при обновлении.Кроме того, если вы изменили порядок маркеров и меток с помощью markerfirst, он будет потерян при обновлении.

from matplotlib import pyplot as plt
fig, ax = plt.subplots()
ax.plot([0,1,2,3,4,5,6], label='linear')
ax.plot([0,1,4,9,16,25,36], label='square')
lgd = ax.legend(loc='lower right')

def add_patch(legend):
    from matplotlib.patches import Patch
    ax = legend.axes

    handles, labels = ax.get_legend_handles_labels()
    handles.append(Patch(facecolor='orange', edgecolor='r'))
    labels.append("Color Patch")

    legend._legend_box = None
    legend._init_legend_box(handles, labels)
    legend._set_loc(legend._loc)
    legend.set_title(legend.get_title().get_text())


add_patch(lgd)

plt.show()

enter image description here

1 голос
/ 29 апреля 2019

Добавляет ли цветовая метка после построения линий, но до добавления легенды параметр?

import matplotlib.pyplot as plt
from matplotlib.patches import Patch

fig, ax = plt.subplots()
line1 = ax.plot([0,1,2,3,4,5,6], label='linear')
line2 = ax.plot([0,1,4,9,16,25,36], label='square')
patch = Patch(facecolor='orange', edgecolor='r', label='Color patch')
lgd = ax.legend(handles=[line1, line2, patch], loc='lower right')
...