2012-09-19 13 views

risposta

16

Supponendo di avere i dati in una matrice 2D, questo dovrebbe funzionare:

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

È inoltre possibile impostare un attributo cmap per controllare quali colori appariranno attraverso l'uso di una mappa di colori; vale a dire sostituire la linea pylab.scatter con:

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

un elenco di mappe a colori può essere trovato here

+0

In realtà i miei dati hanno 23 di tali etichette. Così, ho assegnato il vettore di colori da 0 a 22 in una forma di lista con lunghezza vettoriale uguale a xy. Tuttavia, viene visualizzato un errore che indica che la lunghezza della sequenza deve essere 3 o 4. – user1050325

+0

Potresti aggiungere qualche codice di esempio e il messaggio di errore alla tua domanda? Ho modificato il semplice esempio che ho inserito qui per avere un migliaio di punti e 23 etichette. – brentlance

+0

Non riesco ad ottenere l'errore quando uso la funzione di stampa. Sfortunatamente avevo sovrascritto il mio codice con la funzione plot e quindi non ero in grado di replicare l'errore. – user1050325

20

La risposta accettata ha a posto, ma se si potrebbe desiderare di specificare quale etichetta di classe dovrebbe essere assegnato a un colore specifico o un'etichetta che potresti fare come segue. Ho fatto una piccola ginnastica con la colorbar, ma rendere la trama si riduce a una bella copertina. Questo funziona benissimo per tracciare i risultati delle classifiche fatte con sklearn. Ogni etichetta corrisponde a una (x, y) coordinata.

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

Utilizzando una versione leggermente modificata di this risposta, si può generalizzare quanto sopra per N i colori come segue:

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

Che dà:

enter image description here

+0

Puoi farlo con 23 colori (come OP dice che ha, e così ho io) e, diciamo, 1k punti casuali? La tua risposta è ottima, e ho la mia recensione per l'immagine, ma mi piacerebbe sapere se funziona con> 10 classi. –

+0

Vedere le modifiche sopra. – salomonvh

+0

Grande, molte grazie. –

4

Una soluzione semplice è assegnare il colore per ogni classe. In questo modo, possiamo controllare come ogni colore è per ogni classe. Ad esempio:

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) 
Problemi correlati