Можно ли добавить строку в качестве элемента легенды в matplotlib

Я создаю несколько графиков в matplotlib и хотел бы добавить пояснительный текст для некоторых данных. Я хочу иметь строку внутри моей легенды в виде отдельного элемента легенды над элементом «0-10». Кто-нибудь знает, есть ли возможный способ сделать это?

введите здесь описание изображения

Это код моей легенды:
ax.legend(['0-10','10-100','100-500','500+'],loc='best')


person Osmond Bishop    schedule 30.05.2013    source источник
comment
Если нет правильного способа сделать это, единственный другой вариант, который я могу придумать, - это обмануть график, чтобы создать его, нанеся некоторые пустые значения.   -  person Osmond Bishop    schedule 30.05.2013
comment
Попробуйте функцию annotate(). Я только что задал аналогичный вопрос: stackoverflow.com/questions/16823703/adding- этикетка-контур   -  person theta    schedule 30.05.2013
comment
Почему бы просто не установить легенды title? т.е. ax.legend(['0-10','10-100','100-500','500+'], loc='best', title='Explanatory text').   -  person sodd    schedule 31.05.2013


Ответы (2)


Конечно. ax.legend() имеет форму с двумя аргументами, которая принимает список объектов (дескрипторов) и список строк (меток). Используйте фиктивный объект (он же "proxy artist") в качестве дополнительной строки. Я выбрал matplotlib.patches.Rectangle без заливки и 0 линий ниже, но вы можете использовать любого поддерживаемого исполнителя.

Например, предположим, что у вас есть 4 столбчатых объекта (поскольку вы не разместили код, используемый для создания графика, я не могу точно его воспроизвести).

import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
fig = plt.figure()
ax = fig.add_subplot(111)
bar_0_10 = ax.bar(np.arange(0,10), np.arange(1,11), color="k")
bar_10_100 = ax.bar(np.arange(0,10), np.arange(30,40), bottom=np.arange(1,11), color="g")
# create blank rectangle
extra = Rectangle((0, 0), 1, 1, fc="w", fill=False, edgecolor='none', linewidth=0)
ax.legend([extra, bar_0_10, bar_10_100], ("My explanatory text", "0-10", "10-100"))
plt.show()

пример вывода

person Jeff Tratner    schedule 30.05.2013
comment
Спасибо, это работает. Я также хотел бы сделать это с другим графиком, на котором линия нанесена поверх столбцов, но я получаю следующую ошибку c:\Python27\lib\site-packages\matplotlib\legend.py:628: UserWarning: Legend не поддерживает объект [‹matplotlib.lines.Line2D по адресу 0x0A7027B0›]. Вместо этого используйте прокси-исполнителя. - person Osmond Bishop; 31.05.2013
comment
это на самом деле очень распространенная вещь. Бьюсь об заклад, вы сделали что-то вроде: line = ax.plot(x, y). Проблема в том, что plot возвращает список строк, поэтому вам нужно добраться до настоящего исполнителя. Вы можете выполнить либо line = ax.plot(x, y)[0], либо line, = ax.plot(x, y), в котором используется распаковка параметров. - person Jeff Tratner; 31.05.2013

Альтернативное решение, немного грязное, но довольно быстрое.

import pylab as plt

X = range(50)
Y = range(50)
plt.plot(X, Y, label="Very straight line")

# Create empty plot with blank marker containing the extra label
plt.plot([], [], ' ', label="Extra label on the legend")

plt.legend()
plt.show()

введите описание изображения здесь

person Clement H.    schedule 20.07.2017
comment
Умное решение. Мне это нравится больше, чем другое. Престижность - person Markos di Mitsas; 17.06.2018
comment
Не могу поверить, что так много других тем дали запутанные решения и пропустили это простое!!! Возможно, matplotlib не так интуитивно понятен? Это так? - person Mahesha999; 12.11.2020