La réponse à votre question est liée à deux autres questions sur les SO.
La réponse à Comment choisir une nouvelle couleur pour chaque ligne tracée dans une figure en matplotlib ? explique comment définir la liste de couleurs par défaut qui est parcourue pour choisir la couleur suivante à tracer. Ceci est fait avec la fonction Axes.set_color_cycle
méthode .
Vous voulez cependant obtenir la liste correcte des couleurs, ce qui est plus facile à faire en utilisant une carte de couleurs, comme expliqué dans la réponse à cette question : Créer un générateur de couleurs à partir d'une carte de couleurs donnée dans matplotlib . Là, une carte de couleur prend une valeur de 0 à 1 et renvoie une couleur.
Ainsi, pour vos 20 lignes, vous souhaitez effectuer un cycle de 0 à 1 par pas de 1/20. Plus précisément, vous souhaitez effectuer un cycle de 0 à 19/20, car 1 renvoie à 0.
C'est ce qui est fait dans cet exemple :
import matplotlib.pyplot as plt
import numpy as np
NUM_COLORS = 20
cm = plt.get_cmap('gist_rainbow')
fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_color_cycle([cm(1.*i/NUM_COLORS) for i in range(NUM_COLORS)])
for i in range(NUM_COLORS):
ax.plot(np.arange(10)*(i+1))
fig.savefig('moreColors.png')
plt.show()
Voici la figure qui en résulte :
Solution alternative, meilleure (discutable)
Il existe une autre méthode qui utilise un ScalarMappable
pour convertir une gamme de valeurs en couleurs. L'avantage de cette méthode est que vous pouvez utiliser une méthode non linéaire pour convertir des valeurs en couleurs. Normalization
pour convertir l'indice de ligne en couleur réelle. Le code suivant produit exactement le même résultat :
import matplotlib.pyplot as plt
import matplotlib.cm as mplcm
import matplotlib.colors as colors
import numpy as np
NUM_COLORS = 20
cm = plt.get_cmap('gist_rainbow')
cNorm = colors.Normalize(vmin=0, vmax=NUM_COLORS-1)
scalarMap = mplcm.ScalarMappable(norm=cNorm, cmap=cm)
fig = plt.figure()
ax = fig.add_subplot(111)
# old way:
#ax.set_color_cycle([cm(1.*i/NUM_COLORS) for i in range(NUM_COLORS)])
# new way:
ax.set_color_cycle([scalarMap.to_rgba(i) for i in range(NUM_COLORS)])
for i in range(NUM_COLORS):
ax.plot(np.arange(10)*(i+1))
fig.savefig('moreColors.png')
plt.show()
Note de dépréciation
Dans les versions plus récentes de mplib (1.5+), la fonction set_color_cycle
a été supprimée au profit de la fonction ax.set_prop_cycle(color=[...])
.
0 votes
Il se trouve que la légende n'a rien à voir avec les couleurs. Il y aurait des répétitions dans la couleur, que vous ayez une légende ou non.
9 votes
C'est assez fou pour moi que
matplotlib
par défaut réutilise les couleurs si facilement