2012-09-19 45 views

Respuesta

16

Asumiendo que usted tiene sus datos en una matriz 2D, esto debería funcionar:

import numpy 
import pylab 
xy = numpy.zeros((2, 1000)) 
xy[0] = range(1000) 
xy[1] = range(1000) 
colors = [int(i % 23) for i in xy[0]] 
pylab.scatter(xy[0], xy[1], c=colors) 
pylab.show() 

También puede establecer un atributo cmap para controlar qué colores van a aparecer a través del uso de un mapa de colores; es decir, sustituir la línea pylab.scatter con:

pylab.scatter(xy[0], xy[1], c=colors, cmap=pylab.cm.cool) 

Una lista de los mapas de color se puede encontrar here

+0

Actualmente mis datos tienen 23 de tales etiquetas. Por lo tanto, asigné el vector de colores para que sea de 0 a 22 en forma de lista con una longitud de vector igual a xy. Sin embargo, aparece un error que dice que la longitud de la secuencia debe ser de 3 o 4. – user1050325

+0

¿Podría agregar algún código de ejemplo y el mensaje de error a su pregunta? Modifiqué el ejemplo simple que coloqué aquí para tener mil puntos y 23 etiquetas. – brentlance

+0

No obtengo el error cuando uso la función de trazado. Lamentablemente, había sobrescrito mi código con la función de trazado y, por lo tanto, no podía replicar el error. – user1050325

20

La respuesta aceptada tiene que en el clavo, pero si es posible que desee especificar qué clase de etiqueta se debe asignar a un color o etiqueta específica, puede hacer lo siguiente. Hice un poco de gimnasia con la barra de colores, pero haciendo que la trama se reduzca a un buen trazo. Esto funciona muy bien para trazar los resultados de las clasificaciones realizadas con sklearn. Cada etiqueta coincide con una coordenada (x, y).

import matplotlib 
import matplotlib.pyplot as plt 
import numpy as np 

x = [4,8,12,16,1,4,9,16] 
y = [1,4,9,16,4,8,12,3] 
label = [0,1,2,3,0,1,2,3] 
colors = ['red','green','blue','purple'] 

fig = plt.figure(figsize=(8,8)) 
plt.scatter(x, y, c=label, cmap=matplotlib.colors.ListedColormap(colors)) 

cb = plt.colorbar() 
loc = np.arange(0,max(label),max(label)/float(len(colors))) 
cb.set_ticks(loc) 
cb.set_ticklabels(colors) 

Scatter plot color labels

utilizando una versión ligeramente modificada de this respuesta, se puede generalizar el anteriormente para N colores como sigue:

import numpy as np 
import matplotlib as mpl 
import matplotlib.pyplot as plt 

N = 23 # Number of labels 

# setup the plot 
fig, ax = plt.subplots(1,1, figsize=(6,6)) 
# define the data 
x = np.random.rand(1000) 
y = np.random.rand(1000) 
tag = np.random.randint(0,N,1000) # Tag each point with a corresponding label  

# define the colormap 
cmap = plt.cm.jet 
# extract all colors from the .jet map 
cmaplist = [cmap(i) for i in range(cmap.N)] 
# create the new map 
cmap = cmap.from_list('Custom cmap', cmaplist, cmap.N) 

# define the bins and normalize 
bounds = np.linspace(0,N,N+1) 
norm = mpl.colors.BoundaryNorm(bounds, cmap.N) 

# make the scatter 
scat = ax.scatter(x,y,c=tag,s=np.random.randint(100,500,N),cmap=cmap,  norm=norm) 
# create the colorbar 
cb = plt.colorbar(scat, spacing='proportional',ticks=bounds) 
cb.set_label('Custom cbar') 
ax.set_title('Discrete color mappings') 
plt.show() 

Lo que da:

enter image description here

+0

¿Podría hacerlo con 23 colores (como OP dice que tiene, y yo también) y, por ejemplo, 1k puntos aleatorios? Su respuesta es excelente, y tengo mi voto positivo para la foto, pero me gustaría saber si esto funciona con> 10 clases. –

+0

Ver las ediciones anteriores. – salomonvh

+0

Genial, muchas gracias. –

4

Una solución simple es asignar color para cada clase. De esta forma, podemos controlar cómo es cada color para cada clase. Por ejemplo:

arr1 = [1, 2, 3, 4, 5] 
arr2 = [2, 3, 3, 4, 4] 
labl = [0, 1, 1, 0, 0] 
color= ['red' if l == 0 else 'green' for l in labl] 
plt.scatter(arr1, arr2, color=color) 
Cuestiones relacionadas