La réponse acceptée est parfaitement exacte, mais si vous souhaitez spécifier quelle étiquette de classe doit être attribuée à une couleur ou une étiquette spécifique, vous pourriez faire ce qui suit. J'ai fait un peu de gymnastique avec les étiquettes de couleur, mais en faisant le graphique lui-même se réduit à une belle ligne. Cela fonctionne très bien pour tracer les résultats des classifications faites avec sklearn. Chaque étiquette correspond à une coordonnée (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)
En utilisant une version légèrement modifiée de cette réponse, on peut généraliser ce qui précède pour N couleurs comme suit :
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
N = 23 # Nombre d'étiquettes
# Configuration du graphique
fig, ax = plt.subplots(1,1, figsize=(6,6))
# Définition des données
x = np.random.rand(1000)
y = np.random.rand(1000)
tag = np.random.randint(0,N,1000) # Attribuer un tag à chaque point avec une étiquette correspondante
# Définition de la colormap
cmap = plt.cm.jet
# Extraire toutes les couleurs de la carte .jet
cmaplist = [cmap(i) for i in range(cmap.N)]
# Créer la nouvelle carte
cmap = cmap.from_list('Custom cmap', cmaplist, cmap.N)
# Définition des intervalles et normalisation
bounds = np.linspace(0,N,N+1)
norm = mpl.colors.BoundaryNorm(bounds, cmap.N)
# Créer le nuage de points
scat = ax.scatter(x,y,c=tag,s=np.random.randint(100,500,N),cmap=cmap, norm=norm)
# Créer la barre de couleur
cb = plt.colorbar(scat, spacing='proportional',ticks=bounds)
cb.set_label('Custom cbar')
ax.set_title('Mappages de couleurs discrètes')
plt.show()
Ce qui donne :