Существует два способа сделать это. Один из них дает вам легендарные записи для каждой вещи, которую вы замышляете, а другой позволяет вам вставить все, что вы хотите в легенду, тяжело крадя от this.
Вот первый способ:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-1,1,100)
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
#Plot something
ax.plot(x,x, color='red', ls="-", label="$P_1(x)$")
ax.plot(x,0.5 * (3*x**2-1), color='green', ls="--", label="$P_2(x)$")
ax.plot(x,0.5 * (5*x**3-3*x), color='blue', ls=":", label="$P_3(x)$")
ax.legend()
plt.show()
ax.legend()
функция имеет более одного использования, первый раз создает легенду, основанную на линиях в axes
объекта, второй allwos контролировать записи вручную, и описывается here.
Вам в основном нужно дать легенде строки и соответствующие метки.
Другой способ позволяет поместить все, что вы хотите в легенде, путем создания объектов и меток Artist
и передачи их в функцию ax.legend()
. Вы можете использовать это, чтобы поместить некоторые из своих линий в легенду, или вы можете использовать его, чтобы поместить все, что вы хотите в легенде.
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-1,1,100)
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
#Plot something
p1, = ax.plot(x,x, color='red', ls="-", label="$P_1(x)$")
p2, = ax.plot(x,0.5 * (3*x**2-1), color='green', ls="--", label="$P_2(x)$")
p3, = ax.plot(x,0.5 * (5*x**3-3*x), color='blue', ls=":", label="$P_3(x)$")
#Create legend from custom artist/label lists
ax.legend([p1,p2], ["$P_1(x)$", "$P_2(x)$"])
plt.show()
Или вот, мы создаем новые Line2D
объекты, и передать их в легенду.
import matplotlib.pyplot as pltit|delete|flag
import numpy as np
import matplotlib.patches as mpatches
x = np.linspace(-1,1,100)
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
#Plot something
p1, = ax.plot(x,x, color='red', ls="-", label="$P_1(x)$")
p2, = ax.plot(x,0.5 * (3*x**2-1), color='green', ls="--", label="$P_2(x)$")
p3, = ax.plot(x,0.5 * (5*x**3-3*x), color='blue', ls=":", label="$P_3(x)$")
fakeLine1 = plt.Line2D([0,0],[0,1], color='Orange', marker='o', linestyle='-')
fakeLine2 = plt.Line2D([0,0],[0,1], color='Purple', marker='^', linestyle='')
fakeLine3 = plt.Line2D([0,0],[0,1], color='LightBlue', marker='*', linestyle=':')
#Create legend from custom artist/label lists
ax.legend([fakeLine1,fakeLine2,fakeLine3], ["label 1", "label 2", "label 3"])
plt.show()
Я также пытался получить метод, используя patches
работать, как на направляющем странице Matplotlib легенда, но это не похоже на работу, так что я сдался.
Так что, в вашем примере, 'recs' и' labels 'имеют одинаковую длину? И нет ли способа добавить легенду, используя маркеры по умолчанию, как это показано в моем примере? Кажется странным, что единственный способ иметь легенду в плане рассеяния - создать список фигур для всех точек, а не просто автоматически назначать все точки одной и той же формы. – Karnivaurus
«Ярлыки» в первом примере были неверными, я хотел использовать «классы». Я также нашел второй способ сделать легенду в документации, которую я добавил в ответ, а также скриншоты. Я написал второй блок кода с предположением, что данные из разных классов смешиваются. Если вы знаете, что ваши данные сгруппированы по классу и цвету, вы можете значительно упростить второй блок кода, используя, например, 'xc = x [0: 2]' для класса 'A'. Или если ваши данные были первоначально разделены классом, то просто никогда не объединяйте его в один список и не пропустите необходимость в создании списка. – TheSchwa