0

Не найдены элементы с подписями для добавления в легенду

29

Я пытаюсь создать параллелограмм в 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 ответ(ов)

0

Хотя это может быть немного поздно, для всех, кто сталкивается с аналогичной проблемой, решением будет использование метода 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() в конце, чтобы увидеть легенду правильно.

0

Ошибка возникает потому, что вы не указали текст метки.

Вы можете сделать что-то вроде этого:

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 просто список чисел, для которого я создаю гистограмму, в первом примере мы используем три списка чисел для создания стековой гистограммы.

Главное: ошибка возникает из-за отсутствия текста метки и вызова/инициализации легенды.

0

У меня возникла эта ошибка, когда я использовал метки, начинающиеся с подчеркивания:

plt.plot(x, y, label='_bad_name')

Удаление начального подчеркивания из меток решило проблему.

0

Если у вас есть два графика ax и ax2, вы можете получить метки с каждой оси y, используя метод ax.get_ylabel(). Затем, для добавления легенды, вы можете воспользоваться свойством .legend, которое принимает массив меток.

Вот как это можно сделать:

fig.legend([ax.get_ylabel(), ax2.get_ylabel()], loc='upper right')

Таким образом, в легенде будут отображаться метки осей y для обоих графиков, расположенные в верхнем правом углу.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь