173

I noticed when you plot that the first line is blue, then orange, then green, and so on.

Is there some way to access this list of colours? I've seen a million posts on how to change the colour cycle or access the iterator, but not on how to just get the list of colours that matplotlib cycles through by default.

Peter
  • 12,274
  • 9
  • 71
  • 86

4 Answers4

198

In matplotlib versions >= 1.5, you can print the rcParam called 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']

Or equivalently, in python2:

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

In versions < 1.5, this was called color_cycle:

print plt.rcParams['axes.color_cycle']

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

Note that the default color cycle changed in version 2.0.0 http://matplotlib.org/users/dflt_style_changes.html#colors-in-default-property-cycle

tmdavison
  • 64,360
  • 12
  • 187
  • 165
  • 4
    Thanks! Slight correction: The first one should be: `lines_colour_cycle = [p['color'] for p in plt.rcParams['axes.prop_cycle']]` – Peter Apr 30 '17 at 15:44
  • 5
    @Peter, yes, or `plt.rcParams['axes.prop_cycle'].by_key()['color']` – tmdavison Jun 02 '17 at 15:46
186

Often, there is no need to get the default color cycle from anywhere, as it is the default one, so just using it is sufficient.

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

In case you want to use the default color cycle for something different, there are of course several options.

"tab10" colormap

First it should be mentionned that the "tab10" colormap comprises the colors from the default color cycle, you can get it via cmap = plt.get_cmap("tab10").

Equivalent to the above would hence be

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()

Colors from color cycle

You can also use the color cycler directly, cycle = plt.rcParams['axes.prop_cycle'].by_key()['color']. This gives list with the colors from the cycle, which you can use to iterate over.

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()

The CN notation

Finally, the CN notation allows to get the Nth color of the color cycle, color="C{}".format(i). This however only works for the first 10 colors (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()

All codes presented here produce the same plot.

ImportanceOfBeingErnest
  • 321,279
  • 53
  • 665
  • 712
  • is it possible to tell matplotlib to use some kind of cycle? Having to iterate over the colors array means you have to add the logic for going back to index 0 after using one full cycle. – Mehdi Mar 01 '19 at 16:00
  • @Mehdi Sure, matplotlib does use a color cycle. This question asks for getting the colors of this cycle. – ImportanceOfBeingErnest Mar 01 '19 at 16:06
  • 19
    I think `CN` notation should be much more prominent in your answer, I almost missed it. I suspect the vast majority of use cases is happy with being able to access only the first 10 colours, and passing `'C1'` an friends is way less boilerplate than explicitly grabbing the prop cycle. – Andras Deak -- Слава Україні May 14 '19 at 11:32
  • 1
    upvoted for the `CN`-notation, it was exactly what I was looking for – pcko1 Aug 25 '22 at 22:39
  • 1
    Ah thank you for the `CN` notation! Exactly what I needed without bothering to actually get a handle of the default colour cycle. – Ray Jan 17 '23 at 15:28
8

The CN notation revisited

I'd like to address a new development of Matplotlib. In a previous answer we read

Finally, the CN notation allows to get the Nth color of the color cycle, color="C{}".format(i). This however only works for the first 10 colors (N in [0,1,...9])

but

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()                                           

gives

enter image description here

gboffi
  • 22,939
  • 8
  • 54
  • 85
  • Could you add a link to the source? Thanks – Luca May 03 '21 at 10:28
  • @Luca I have no source, I just have found that it works... At any rate, the ultimate source is Matplotlib source code, but `.../matplotlib/colors.py` is > 2000 lines and alas I haven't found my way in it when looking to answer your question. – gboffi May 03 '21 at 12:48
  • You just show a plot and leave people to make up their own conclusions. What's the point in that? – miterhen Mar 10 '22 at 14:38
  • 1
    For those that are interested, this change was made in v3.1.0, and is documented in the API changes [here](https://matplotlib.org/stable/api/prev_api_changes/api_changes_3.1.0.html#cn-colors-now-support-n-10) – tmdavison Feb 07 '23 at 17:41
5

if you're looking for a quick one-liner to get the RGB colors that matplotlib uses for its lines, here it is:

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

Or for 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)
Peter
  • 12,274
  • 9
  • 71
  • 86