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)
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à:
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
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
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