#matplotlib #seaborn #legend #points
Вопрос:
В настоящее время я создаю свою легенду с помощью matplotlib таким образом:
if t==25:
l1,l2 = ax2.plot(x320,vTemp320,'or',x320,vAnaTemp320,'-r')
elif t==50:
l3,l4 = ax2.plot(x320,vTemp320,'ob',x320,vAnaTemp320,'-b')
else:
l5,l6 = ax2.plot(x320,vTemp320,'og',x320,vAnaTemp320,'-g')
plt.legend((l1,l2,l3,l4,l5,l6), ('t=25 Simulation', 't=25 Analytical','t=50 Simulation', 't=50 Analytical','t=500 Simulation', 't=500 Analytical'),
bbox_to_anchor=(-.25, 1), loc=2, borderaxespad=0.,prop={'size':12})
Что каким-то образом работает см. 1. Но я продублировал информацию в своей легенде.
Я бы предпочел отделить легенду. Так что у меня есть разные цветные линии, соответствующие времени t. И нормальная линия в качестве моего аналитического решения и точки для результатов моего моделирования.
Что-то вроде того
—(красная линия) t = 25
—(синяя линия) t = 50
—(зеленая линия) t = 500
o Симулятон
— Аналитическое Решение
Кто-нибудь знает, как я мог бы добиться этого с помощью matplotlib?
Ответ №1:
Вы можете выбрать исполнителей и этикетки для отображения в легенде следующим образом. Вам нужно будет создать пользовательские исполнители для элементов легенды, которые на самом деле не нанесены на карту.
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0,10,31)
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
#Plot analytic solution
ax.plot(x,1*x**2, color='r', label="t = 25")
ax.plot(x,2*x**2, color='b', label="t = 50")
ax.plot(x,3*x**2, color='g', label="t = 500")
#Plot simulation
ax.plot(x,1*x**2, color='r', linestyle='', marker='o')
ax.plot(x,2*x**2, color='b', linestyle='', marker='o')
ax.plot(x,3*x**2, color='g', linestyle='', marker='o')
#Get artists and labels for legend and chose which ones to display
handles, labels = ax.get_legend_handles_labels()
display = (0,1,2)
#Create custom artists
simArtist = plt.Line2D((0,1),(0,0), color='k', marker='o', linestyle='')
anyArtist = plt.Line2D((0,1),(0,0), color='k')
#Create legend from custom artist/label lists
ax.legend([handle for i,handle in enumerate(handles) if i in display] [simArtist,anyArtist],
[label for i,label in enumerate(labels) if i in display] ['Simulation', 'Analytic'])
plt.show()
Комментарии:
1. Это может быть вопрос на английском языке, но что вы подразумеваете под «художником»?
2. @Мистер Скуиг. Модуль
artist
, классArtist
.3. Это больше не работает для создания нескольких точек для записи легенды. Одно из решений состоит в том, чтобы сгруппировать несколько исполнителей Line2D с помощью скобок
(Line2D((0),(0)...), Line2D((1),(0),... )
, а затем использоватьhandler_map={tuple: HandlerTuple(ndivide=None)}
. Подробнее здесь: matplotlib.org/stable/gallery/text_labels_and_annotations/…