Matplotlib Legend не появится - PullRequest
0 голосов
/ 28 марта 2020

Каждый вариант, который я пробую, не отображает легенды для моего сюжета. Пожалуйста помоги. Вот код и график отлично работает, все мои входные данные - простые 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 ]

1 голос
/ 28 марта 2020

Вызов 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()
0 голосов
/ 28 марта 2020

Похоже, вы смешиваете объектно-ориентированный (ОО) стиль печати со стилем 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')) вообще - это объект, который вы не определил в первую очередь

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

0 голосов
/ 28 марта 2020

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

plt.legend(['first stock name', 'second stock name'])
0 голосов
/ 28 марта 2020

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

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

Затем вы можете изменить свой вызов легенды так: plt.legend().

...