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