2014-02-07 8 views
5

Ich habe eine lineare Regression durchgeführt und möchte die Marker (Originaldaten) und die Linien (Regression) in derselben Zeile in der Legende darstellen. Der Einfachheit halber ist hier eine Fälschung Regression:matplotlib legende: Einschließen von Markern und Linien aus zwei verschiedenen Graphen in einer Zeile

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

Deshalb möchte ich die Legende von 2 Linien bestehen, die jeweils eine Linie und einen Punkt zeigt, anstelle von 4 Linien. Wie kann ich das machen?

Antwort

1

können Sie versuchen, nur mit

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

oder wenn Sie eines armen Mannes Lösung wollen, können Sie etwas außerhalb des Darstellungs-Bereich und beschriften nur das Grundstück plotten. Zum Beispiel

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

für das andere Etikett das gleiche tun und dann Handlung zwingen, nicht p5, zum Beispiel zu umfassen, wie diese

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

Normalerweise löste ich dieses Problem, indem ich Dummy-Zeilen mit den Plot-Eigenschaften, die ich zeigen möchte, erstelle. Ich denke jedoch, @ tcaswells Lösung ist besser.

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' 
) 
Verwandte Themen