Matplotlib scatter plot legend

Creé una gráfica de dispersión 4D para representar diferentes temperaturas en un área específica. Cuando creo la leyenda, la leyenda muestra el símbolo y el color correctos, pero agrega una línea a través de él. El código que estoy usando es:

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) 

Intenté cambiar Line2D a Scatter y scatter . Scatter devolvió un error y la scatter cambió el gráfico y devolvió un error.

Con la scatter , cambié el range(10) a las listas que contienen los puntos de datos. Cada lista contiene la variable 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) 

Cuando ejecuto esto, la leyenda ya no existe, es una pequeña caja blanca en la esquina con nada en ella.

¿Algún consejo?

Gráfico de dispersión 2D

El uso del método de scatter del módulo matplotlib.pyplot debería funcionar (al menos con matplotlib 1.2.1 con Python 2.7.5), como se muestra en el siguiente código de ejemplo. Además, si está utilizando diagtwigs de dispersión, use scatterpoints=1 lugar de numpoints=1 en la llamada de leyenda para tener solo un punto por cada entrada de leyenda.

En el código siguiente, he usado valores aleatorios en lugar de trazar el mismo rango una y otra vez, haciendo que todos los gráficos estén visibles (es decir, no se superpongan entre sí).

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

introduzca la descripción de la imagen aquí

Gráfico de dispersión 3D

Para trazar una dispersión en 3D, use el método de plot , ya que la leyenda no es compatible con Patch3DCollection como lo devuelve el método de scatter de una instancia de Axes3D . Para especificar el markerstyle, puede incluir esto como un argumento posicional en la llamada al método, como se ve en el siguiente ejemplo. Opcionalmente, se puede incluir un argumento para los parámetros de linestyle y marker .

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

introduzca la descripción de la imagen aquí

Aquí hay una manera más fácil de hacer esto (fuente: aquí ):

 import matplotlib.pyplot as plt from numpy.random import rand fig, ax = plt.subplots() for color in ['red', 'green', 'blue']: n = 750 x, y = rand(2, n) scale = 200.0 * rand(n) ax.scatter(x, y, c=color, s=scale, label=color, alpha=0.3, edgecolors='none') ax.legend() ax.grid(True) plt.show() 

Y obtendrás esto:

introduzca la descripción de la imagen aquí

Echa un vistazo a aquí para las propiedades de la leyenda