2013-07-01 10 views
34

Ich habe ein 4D-Streudiagramm erstellt, um verschiedene Temperaturen in einem bestimmten Bereich darzustellen. Wenn ich die Legende erstelle, zeigt die Legende das korrekte Symbol und die richtige Farbe, fügt aber eine Linie hinzu. Der Code Ich verwende ist:Matplotlib Scatterplot-Legende

colors=['b', 'c', 'y', 'm', 'r'] 
lo = plt.Line2D(range(10), range(10), marker='x', color=colors[0]) 
ll = plt.Line2D(range(10), range(10), marker='o', color=colors[0]) 
l = plt.Line2D(range(10), range(10), marker='o',color=colors[1]) 
a = plt.Line2D(range(10), range(10), marker='o',color=colors[2]) 
h = plt.Line2D(range(10), range(10), marker='o',color=colors[3]) 
hh = plt.Line2D(range(10), range(10), marker='o',color=colors[4]) 
ho = plt.Line2D(range(10), range(10), marker='x', color=colors[4]) 
plt.legend((lo,ll,l,a, h, hh, ho),('Low Outlier', 'LoLo','Lo', 'Average', 'Hi', 'HiHi', 'High Outlier'),numpoints=1, loc='lower left', ncol=3, fontsize=8) 

Ich versuchte Line2D-Scatter und scatter ändern. Scatter hat einen Fehler zurückgegeben und scatter hat das Diagramm geändert und einen Fehler zurückgegeben.

Mit scatter änderte ich die range(10) in die Listen mit den Datenpunkten. Jede Liste enthält entweder die x-, y- oder z-Variable.

Wenn ich dies ausführen, existiert die Legende nicht mehr, es ist eine kleine weiße Box in der Ecke mit nichts darin.

Irgendwelche Ratschläge?

+0

glaube ich, eine viel bessere Lösung gegeben ist [hier] (http://stackoverflow.com/questions/21654635/scatter-plots-in-pandas-pyplot-how-to-plot nach Kategorie). – dmvianna

Antwort

82

2D Streuplot

Verwenden der scatter Methode des matplotlib.pyplot Modul funktionieren soll (zumindest mit matplotlib 1.2.1 mit Python 2.7.5), wie in dem Beispiel unten Code. Wenn Sie Streudiagramme verwenden, verwenden Sie im Legendenaufruf scatterpoints=1 anstelle von numpoints=1, um nur einen Punkt für jeden Legendeneintrag zu haben.

Im folgenden Code habe ich zufällige Werte verwendet, anstatt den gleichen Bereich immer und immer wieder zu zeichnen, so dass alle Diagramme sichtbar sind (d. H. Sich nicht überlappen).

import matplotlib.pyplot as plt 
from numpy.random import random 

colors = ['b', 'c', 'y', 'm', 'r'] 

lo = plt.scatter(random(10), random(10), marker='x', color=colors[0]) 
ll = plt.scatter(random(10), random(10), marker='o', color=colors[0]) 
l = plt.scatter(random(10), random(10), marker='o', color=colors[1]) 
a = plt.scatter(random(10), random(10), marker='o', color=colors[2]) 
h = plt.scatter(random(10), random(10), marker='o', color=colors[3]) 
hh = plt.scatter(random(10), random(10), marker='o', color=colors[4]) 
ho = plt.scatter(random(10), random(10), marker='x', color=colors[4]) 

plt.legend((lo, ll, l, a, h, hh, ho), 
      ('Low Outlier', 'LoLo', 'Lo', 'Average', 'Hi', 'HiHi', 'High Outlier'), 
      scatterpoints=1, 
      loc='lower left', 
      ncol=3, 
      fontsize=8) 

plt.show() 

enter image description here

3D-Streudiagramm

eine Streuung in 3D zu zeichnen, die plot Methode verwenden, wie die Legende nicht Patch3DCollection unterstützt wie durch die scatter Methode einer Axes3D Instanz zurückgegeben. Um den Markierungsstil anzugeben, können Sie diesen wie im folgenden Beispiel als Positionsargument in den Methodenaufruf einfügen. Optional kann ein Argument für die Parameter linestyle und enthalten sein.

import matplotlib.pyplot as plt 
from numpy.random import random 
from mpl_toolkits.mplot3d import Axes3D 

colors=['b', 'c', 'y', 'm', 'r'] 

ax = plt.subplot(111, projection='3d') 

ax.plot(random(10), random(10), random(10), 'x', color=colors[0], label='Low Outlier') 
ax.plot(random(10), random(10), random(10), 'o', color=colors[0], label='LoLo') 
ax.plot(random(10), random(10), random(10), 'o', color=colors[1], label='Lo') 
ax.plot(random(10), random(10), random(10), 'o', color=colors[2], label='Average') 
ax.plot(random(10), random(10), random(10), 'o', color=colors[3], label='Hi') 
ax.plot(random(10), random(10), random(10), 'o', color=colors[4], label='HiHi') 
ax.plot(random(10), random(10), random(10), 'x', color=colors[4], label='High Outlier') 

plt.legend(loc='upper left', numpoints=1, ncol=3, fontsize=8, bbox_to_anchor=(0, 0)) 

plt.show() 

enter image description here

+0

Funktioniert das auch für 3D-Streudiagramme? – user2386081

+1

Um die Legende zum Zeichnen einer 3D-Streuung zu verwenden, verwenden Sie die Methode 'plot' mit dem Marker als Positionsargument. Siehe Bearbeiten. – hooy