170 votes

Obtenir le cycle de couleur de ligne par défaut

J'ai remarqué que lorsque vous tracez un graphique, la première ligne est bleue, puis verte, puis rouge, et ainsi de suite.

Existe-t-il un moyen d'accéder à cette liste de couleurs ? J'ai vu un million de messages sur la façon de modifier le cycle des couleurs ou d'accéder à l'itérateur, mais pas sur la façon d'obtenir la liste des couleurs que matplotlib parcourt par défaut.

195voto

tom Points 25939

Dans les versions de matplotlib >= 1.5, vous pouvez imprimer l'élément rcParam appelé axes.prop_cycle :

print(plt.rcParams['axes.prop_cycle'].by_key()['color'])

# [u'#1f77b4', u'#ff7f0e', u'#2ca02c', u'#d62728', u'#9467bd', u'#8c564b', u'#e377c2', u'#7f7f7f', u'#bcbd22', u'#17becf']

Ou, de manière équivalente, dans python2 :

print plt.rcParams['axes.prop_cycle'].by_key()['color']

Dans les versions < 1.5, cela s'appelait color_cycle :

print plt.rcParams['axes.color_cycle']

# [u'b', u'g', u'r', u'c', u'm', u'y', u'k']

Notez que le cycle de couleur par défaut a changé dans la version 2.0.0 http://matplotlib.org/users/dflt_style_changes.html#colors-in-default-property-cycle

4 votes

Merci ! Légère correction : Le premier devrait être : lines_colour_cycle = [p['color'] for p in plt.rcParams['axes.prop_cycle']]

5 votes

@Peter, oui, ou plt.rcParams['axes.prop_cycle'].by_key()['color']

183voto

Souvent, il n'est pas nécessaire d'obtenir le cycle de couleurs par défaut, car il s'agit du cycle par défaut, et il suffit donc de l'utiliser.

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)

t = np.arange(5)

for i in range(4):
    line, = ax.plot(t,i*(t+1), linestyle = '-')
    ax.plot(t,i*(t+1)+.3,color = line.get_color(), linestyle = ':')

plt.show()

enter image description here

Au cas où vous voudriez utiliser le cycle de couleurs par défaut pour quelque chose de différent, il existe bien sûr plusieurs options.

"Carte de couleurs "tab10

Il convient tout d'abord de mentionner que le "tab10" colormap comprend les couleurs du cycle de couleurs par défaut, vous pouvez l'obtenir via cmap = plt.get_cmap("tab10") .

L'équivalent de ce qui précède serait donc

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)

t = np.arange(5)
cmap = plt.get_cmap("tab10")
for i in range(4):
    ax.plot(t,i*(t+1),   color=cmap(i), linestyle = '-')
    ax.plot(t,i*(t+1)+.3,color=cmap(i), linestyle = ':')

plt.show()

Couleurs du cycle des couleurs

Vous pouvez également utiliser directement le cycleur de couleurs, cycle = plt.rcParams['axes.prop_cycle'].by_key()['color'] . Cela donne une liste avec les couleurs du cycle, que vous pouvez utiliser pour itérer.

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)

t = np.arange(5)
cycle = plt.rcParams['axes.prop_cycle'].by_key()['color']

for i in range(4):
    ax.plot(t,i*(t+1),   color=cycle[i], linestyle = '-')
    ax.plot(t,i*(t+1)+.3,color=cycle[i], linestyle = ':')

plt.show()

El CN notation

Enfin, le CN permet d'obtenir la N e couleur du cycle des couleurs, color="C{}".format(i) . Ceci ne fonctionne cependant que pour les 10 premières couleurs ( N in [0,1,...9] )

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)

t = np.arange(5)

for i in range(4):
    ax.plot(t,i*(t+1),   color="C{}".format(i), linestyle = '-')
    ax.plot(t,i*(t+1)+.3,color="C{}".format(i), linestyle = ':')

plt.show()

Tous les codes présentés ici produisent le même graphique.

0 votes

Est-il possible de dire à matplotlib d'utiliser une sorte de cycle ? Le fait de devoir itérer sur le tableau de couleurs signifie que vous devez ajouter la logique pour revenir à l'index 0 après avoir utilisé un cycle complet.

0 votes

@Mehdi Bien sûr, matplotlib utilise un cycle de couleurs. Cette question demande d'obtenir les couleurs de ce cycle.

19 votes

Creo que CN La notation devrait être beaucoup plus visible dans votre réponse, j'ai failli la manquer. Je pense que la grande majorité des cas d'utilisation est satisfaite de pouvoir accéder uniquement aux 10 premières couleurs et de laisser passer 'C1' un ami est beaucoup moins encombrant que de saisir explicitement le cycle de l'accessoire.

8voto

gboffi Points 3681

La notation CN revisitée

J'aimerais aborder un nouveau développement de Matplotlib. Dans une réponse précédente, nous avons lu

Enfin, le CN permet d'obtenir la N e couleur du cycle des couleurs, color="C{}".format(i) . Ceci ne fonctionne cependant que pour les 10 premières couleurs ( N in [0,1,...9] )

mais

import numpy as np 
import matplotlib.pyplot as plt 

t = np.linspace(0,6.28, 629)                                                      
for N in (1, 2): 
    C0N, C1N = 'C%d'%(N), 'C%d'%(N+10) 
    plt.plot(t, N*np.sin(t), c=C0N, ls='-',  label='c='+C0N) 
    plt.plot(t, N*np.cos(t), c=C1N, ls='--', label='c='+C1N) 
plt.legend() ; plt.grid() ; plt.show()                                           

donne

enter image description here

5voto

Peter Points 121

Si vous cherchez une solution rapide pour obtenir les couleurs RVB que matplotlib utilise pour ses lignes, la voici :

>>> import matplotlib; print('\n'.join([str(matplotlib.colors.to_rgb(c)) for c in matplotlib.pyplot.rcParams['axes.prop_cycle'].by_key()['color']]))
(0.12156862745098039, 0.4666666666666667, 0.7058823529411765)
(1.0, 0.4980392156862745, 0.054901960784313725)
(0.17254901960784313, 0.6274509803921569, 0.17254901960784313)
(0.8392156862745098, 0.15294117647058825, 0.1568627450980392)
(0.5803921568627451, 0.403921568627451, 0.7411764705882353)
(0.5490196078431373, 0.33725490196078434, 0.29411764705882354)
(0.8901960784313725, 0.4666666666666667, 0.7607843137254902)
(0.4980392156862745, 0.4980392156862745, 0.4980392156862745)
(0.7372549019607844, 0.7411764705882353, 0.13333333333333333)
(0.09019607843137255, 0.7450980392156863, 0.8117647058823529)

Ou pour uint8 :

import matplotlib; print('\n'.join([str(tuple(int(round(v*255)) for v in matplotlib.colors.to_rgb(c))) for c in matplotlib.pyplot.rcParams['axes.prop_cycle'].by_key()['color']]))
(31, 119, 180)
(255, 127, 14)
(44, 160, 44)
(214, 39, 40)
(148, 103, 189)
(140, 86, 75)
(227, 119, 194)
(127, 127, 127)
(188, 189, 34)
(23, 190, 207)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X