Leyenda de matplotlib: incluye marcadores y líneas de dos gráficos diferentes en una línea

He estado haciendo una regresión lineal y quiero trazar los marcadores (datos originales) y las líneas (regresión) en la misma línea en la leyenda. Para simplificar, aquí hay una regresión falsa:

from pylab import * ax = subplot(1,1,1) p1, = ax.plot([1,2,3,4,5,6],'r-', label="line 1") p2, = ax.plot([6,5,4,3,2,1],'b-', label="line 2") p3, = ax.plot([1.2,1.8,3.1,4.1,4.8,5.9],'ro', label="dots 1") p4, = ax.plot([6.1,5.1,3.8,3.1,1.9,0.9],'bo', label="dots 2") ax.legend(loc='center right',numpoints=1) show() 

Así que quiero que la leyenda conste de 2 líneas, cada una mostrando una línea y un punto, en lugar de 4 líneas. ¿Cómo puedo hacer eso?

Solo necesitas usar la legend un poco más directamente. Consulte Matplotlib: cómo hacer que el marcador sea de color transparente sin hacer que la línea sea transparente y la guía del usuario .

 ax.legend([(p1, p3), (p2, p4)], ['set 1', 'set 2']) plt.draw() 

Puedes probar con

 from pylab import * ax = subplot(1,1,1) p1, = ax.plot([1,2,3,4,5,6],'r-') p2, = ax.plot([6,5,4,3,2,1],'b-') p3, = ax.plot([1.2,1.8,3.1,4.1,4.8,5.9],'r-o', label="dots 1") p4, = ax.plot([6.1,5.1,3.8,3.1,1.9,0.9],'b-o', label="dots 2") ax.legend(loc='center right',numpoints=1) show() 

o si desea la solución de un hombre pobre, puede trazar algo fuera de su rango de trazado y etiquetar solo ese trazado. Por ejemplo

 p5 = ax.plot(ones(2)*1e6,ones(2)*1e6,'r-o', label="dots 1") 

haga lo mismo con la otra etiqueta y luego fuerce la ttwig para que no incluya p5 , por ejemplo, como este

 ax.set_xlim(0,10);ax.set_ylim(0,10) 

Normalmente resuelvo este problema creando líneas ficticias con las propiedades de trazado que me interesa mostrar. Sin embargo, creo que la solución de @ tcaswell es mejor.

 from matplotlib.lines import Line2D def create_dummy_line(**kwds): return Line2D([], [], **kwds) # your code here # Create the legend lines = [ ('name A', {'color': 'red', 'linestyle': '-', 'marker': 'o'}), ('name B', {'color': 'blue', 'linestyle': '-', 'marker': 'o'}), ] ax.legend( # Line handles [create_dummy_line(**l[1]) for l in lines], # Line titles [l[0] for l in lines], loc='center right' )