2013-07-01 17 views
34

Ho creato un grafico a grafico a dispersione 4D per rappresentare temperature diverse in un'area specifica. Quando creo la legenda, la legenda mostra il simbolo e il colore corretti ma aggiunge una linea attraverso di essa. Il codice che sto utilizzando è:Legenda diagramma a dispersione Matlotlib

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) 

Ho provato a cambiare Line2D-Scatter e scatter. Scatter ha restituito un errore e scatter ha modificato il grafico e ha restituito un errore.

Con scatter, ho modificato lo range(10) negli elenchi che contengono i punti di dati. Ogni lista contiene la variabile x, y o z.

lo = plt.scatter(xLOutlier, yLOutlier, zLOutlier, marker='x', color=colors[0]) 
ll = plt.scatter(xLoLo, yLoLo, zLoLo, marker='o', color=colors[0]) 
l = plt.scatter(xLo, yLo, zLo, marker='o',color=colors[1]) 
a = plt.scatter(xAverage, yAverage, zAverage, marker='o',color=colors[2]) 
h = plt.scatter(xHi, yHi, zHi, marker='o',color=colors[3]) 
hh = plt.scatter(xHiHi, yHiHi, zHiHi, marker='o',color=colors[4]) 
ho = plt.scatter(xHOutlier, yHOutlier, zHOutlier, 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) 

Quando eseguo questo, la leggenda non esiste più, si tratta di una piccola scatola bianca in un angolo con niente dentro.

Qualche consiglio?

+0

Credo che una soluzione molto migliore è data [qui] (http://stackoverflow.com/questions/21654635/scatter-plots-in-pandas-pyplot-how-to-plot -per categoria). – dmvianna

risposta

82

diagramma a dispersione 2D

Utilizzando il metodo del modulo matplotlib.pyplotscatter dovrebbe funzionare (almeno con matplotlib 1.2.1 con Python 2.7.5), come nel codice di esempio. Inoltre, se si utilizzano grafici a dispersione, utilizzare scatterpoints=1 anziché numpoints=1 nella chiamata della legenda per avere un solo punto per ogni voce della legenda.

Nel codice seguente ho usato valori casuali piuttosto che tracciare lo stesso intervallo più e più volte, rendendo tutti i grafici visibili (cioè non sovrapposti l'un l'altro).

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

dispersione 3D trama

per tracciare una dispersione in 3D, utilizzare il metodo plot, come la leggenda non supporta Patch3DCollection come è restituito dal metodo di un Axes3D un'istanza scatter. Per specificare il markerstyle puoi includerlo come argomento posizionale nella chiamata al metodo, come mostrato nell'esempio seguente. Opzionalmente si può includere un argomento per entrambi i parametri linestyle e .

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

Funziona anche per i grafici a dispersione 3D? – user2386081

+1

Per far funzionare la legenda quando si traccia una dispersione 3D, utilizzare il metodo 'plot' con il marker come argomento posizionale. Vedi modifica. – hooy