Jak zrobić własną legendę w matplotlib

Obecnie generuję swoją legendę z matplotlib w ten sposób:

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})

Co jakoś działa zobacz 1. Ale zduplikowałem informacje w mojej legendzie.

Wolałbym oddzielić legendę. Tak, że mam różne kolorowe linie odpowiadające czasowi t. i normalną linię jako moje rozwiązanie analityczne kropki dla wyników mojej symulacji.

Coś w tym stylu

--(czerwona linia) t = 25

--(Niebieska linia) t = 50

-- (zielona linia) t = 500

O Simulaton

-- Rozwiązanie Analityczne

Czy ktoś wie jak mógłbym to osiągnąć z matplotlib?

Obecny obraz

Author: tune2fs, 2012-11-09

1 answers

Możesz wybrać artystów i etykiety do wyświetlania w legendzie w następujący sposób. Musisz utworzyć niestandardowych artystów dla elementów w legendzie, które nie są w rzeczywistości wykreślone.

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()

Przykładowy wykres

 81
Author: Mr. Squig,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-10 05:04:46