Не найдены элементы с подписями для добавления в легенду
Я пытаюсь создать параллелограмм в PyPlot. Пока я не дошёл до рисования параллелограмма — на данный момент я добавляю векторные стрелки, используя следующий код:
fig = plt.figure()
ax = fig.add_subplot(111)
ax.spines['left'].set_position('zero')
ax.spines['right'].set_color('none')
ax.spines['bottom'].set_position('zero')
ax.spines['top'].set_color('none')
plt.axis([-5,5,-5,5])
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
plt.grid()
plt.arrow(0,0, 3,1, head_width=0.2, color='r', length_includes_head=True, label='u')
plt.arrow(0,0, 1,3, head_width=0.2, color='r', length_includes_head=True, label='v')
plt.arrow(0,0, 4,4, head_width=0.2, color='r', length_includes_head=True, label='u+v')
plt.legend()
Однако я получаю следующую ошибку:
No handles with labels found to put in legend.
Не понимаю, почему это происходит, ведь согласно документации к plt.arrow()
, параметр label
является допустимым аргументом, и plt.legend()
должен его считывать. Остальная часть графика отображается нормально; просто отсутствует легенда.
4 ответ(ов)
Хотя это может быть немного поздно, для всех, кто сталкивается с аналогичной проблемой, решением будет использование метода legend()
для соответствующего объекта ax
, а не для plt
.
Вот пример кода, который демонстрирует это:
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)
ax.spines['left'].set_position('zero')
ax.spines['right'].set_color('none')
ax.spines['bottom'].set_position('zero')
ax.spines['top'].set_color('none')
plt.axis([-5, 5, -5, 5])
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
plt.grid()
plt.arrow(0, 0, 3, 1, head_width=0.2, color='r', length_includes_head=True, label='u')
plt.arrow(0, 0, 1, 3, head_width=0.2, color='r', length_includes_head=True, label='v')
plt.arrow(0, 0, 4, 4, head_width=0.2, color='r', length_includes_head=True, label='u+v')
# Используем ax.legend() вместо plt.legend()
ax.legend()
plt.show()
Убедитесь, что вы вызываете ax.legend()
в конце, чтобы увидеть легенду правильно.
Ошибка возникает потому, что вы не указали текст метки.
Вы можете сделать что-то вроде этого:
plt.hist([x01, x02, x03], color=["lightcoral", "lightskyblue", "slategrey"], stacked=True,
label=['Supressed', 'Active', 'Resolved'])
plt.legend()
Или
НЕ используйте plt.legend()
, ЕСЛИ вы не указали текст метки, как в следующем НЕПРАВИЛЬНОМ примере:
plt.hist([x01])
plt.legend()
Это приведет к той же ошибке, поэтому либо удалите функцию legend
, либо предоставьте необходимые данные —> label
.
Побочное замечание: здесь x01
просто список чисел, для которого я создаю гистограмму, в первом примере мы используем три списка чисел для создания стековой гистограммы.
Главное: ошибка возникает из-за отсутствия текста метки и вызова/инициализации легенды.
У меня возникла эта ошибка, когда я использовал метки, начинающиеся с подчеркивания:
plt.plot(x, y, label='_bad_name')
Удаление начального подчеркивания из меток решило проблему.
Если у вас есть два графика ax
и ax2
, вы можете получить метки с каждой оси y, используя метод ax.get_ylabel()
. Затем, для добавления легенды, вы можете воспользоваться свойством .legend
, которое принимает массив меток.
Вот как это можно сделать:
fig.legend([ax.get_ylabel(), ax2.get_ylabel()], loc='upper right')
Таким образом, в легенде будут отображаться метки осей y для обоих графиков, расположенные в верхнем правом углу.
Как вынести легенду за пределы графика
Matplotlib: сохранение графика с легендой вне области построения
Сохранить график в файл изображения вместо его отображения
Как сделать графики Matplotlib отображаемыми внутри IPython-ноутбука?
Цветовой график 2D массива в matplotlib