Matplotlib Legend не появится

Каждый вариант, который я пробую, не дает легенды для моего сюжета. Пожалуйста помоги. Вот код и график отлично работает, все мои входные данные - простые массивы NumPy. При добавлении функции легенды в углу появляется крошечный прямоугольник, поэтому я знаю, что инструкция выполняется, но в ней ничего нет. Я использую Jupyter Notebook, и мои другие попытки показаны после # . Может ли кто-нибудь найти недостаток:

import pandas as pd
import matplotlib.pyplot as plt

ratios = ['Share Price', 'PEG', 'Price to Sales']
final_z_scores = np.transpose(final_z_scores)
print(final_z_scores)

fig = plt.figure(figsize=(6,4))

#plt.plot(ratios, final_z_scores[0], ratios, final_z_scores[1], ratios, final_z_scores[2])
first = plt.plot(ratios, final_z_scores[0])
second = plt.plot(ratios, final_z_scores[1])

#ax.legend((first, second), ('oscillatory', 'damped'), loc='upper right', shadow=True)
ax.legend((first, second), ('label1', 'label2'))
plt.xlabel('Ratio Types')
plt.ylabel('Values')
plt.title('Final Comparisons of Stock Ratios')
plt.legend(loc='upper left')

plt.plot()
plt.show()

Всего 4 ответа


Вызов plt.legend() без указания handles или labels явно подчиняется описанию этой подписи вызова, изложенному здесь :

Элементы, добавляемые в легенду, определяются автоматически, когда вы не передаете никаких дополнительных аргументов.

В этом случае ярлыки взяты у художника. Вы можете указать их либо при создании художника, либо вызвав метод set_label() для художника:

Поэтому для того, чтобы легенда автоматически заполнялась в вашем примере, вам просто нужно назначить метки для разных графиков:

import pandas as pd
import matplotlib.pyplot as plt

ratios = ['Share Price', 'PEG', 'Price to Sales']
final_z_scores = np.transpose(final_z_scores)

fig = plt.figure(figsize=(6,4))
first = plt.plot(ratios, final_z_scores[0], label='label1')
second = plt.plot(ratios, final_z_scores[1], label='label2')

plt.xlabel('Ratio Types')
plt.ylabel('Values')
plt.title('Final Comparisons of Stock Ratios')
plt.legend(loc='upper left')

# Calling plt.plot() here is unnecessary 
plt.show()

Вы можете изменить способ назначения меток в plt.plot() :

first = plt.plot(ratios, final_z_scores[0], label='label1')
second = plt.plot(ratios, final_z_scores[1], label='label2')

Затем вы можете изменить ваш вызов легенды так, чтобы он был: plt.legend() .


Примите во внимание, что атрибут legend принимает список в качестве аргумента. Попробуйте что-то вроде этого:

plt.legend(['first stock name', 'second stock name'])

Похоже, вы смешиваете объектно-ориентированный (ОО) стиль печати со стилем PyPlot. Если вы используете стиль OO, вы начинаете с определения топора:

fig, ax = plt.subplots()

Принимая во внимание, что для стиля PyPlot вы используете plt.plot () напрямую, без предварительного определения топора

В вашем коде вы не определили топор, вы используете стиль PyPlot:

first = plt.plot(ratios, final_z_scores[0])
second = plt.plot(ratios, final_z_scores[1])

Чтобы решить вашу проблему, продолжайте использовать стиль PyPlot:

first = plt.plot(ratios, final_z_scores[0], label='label1')
second = plt.plot(ratios, final_z_scores[1], label='label2')
...
plt.legend()
plt.plot()

Ни в ax.legend((first, second), ('label1', 'label2')) не используйте ax.legend((first, second), ('label1', 'label2')) - это объект, который вы не определили в первую очередь

Хорошее объяснение различий между OO и стилем PyPlot можно найти здесь: https://matplotlib.org/3.2.0/tutorials/introductory/usage.html#sphx-glr-tutorials-introductory-usage-py


Есть идеи?

10000