获取默认的线条颜色周期


95

当您绘制第一行是蓝色,然后是绿色,然后是红色等时,我注意到了。

有什么方法可以访问此颜色列表?我已经看过一百万篇关于如何更改颜色循环或访问迭代器的文章,但是没有关于如何获取默认情况下matplotlib循环通过的颜色列表的文章。

Answers:


119

在matplotlib版本> = 1.5,你可以打印rcParam称为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']

或等效地,在python3

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

在版本<1.5中,这称为color_cycle

print plt.rcParams['axes.color_cycle']

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

请注意,默认颜色周期在2.0.0版中已更改http://matplotlib.org/users/dflt_style_changes.html#colors-in-default-property-cycle


3
谢谢!轻微更正:第一个应该是:lines_colour_cycle = [p['color'] for p in plt.rcParams['axes.prop_cycle']]
彼得

4
@Peter,是,还是plt.rcParams['axes.prop_cycle'].by_key()['color']
tmdavison

91

通常,无需从任何地方获取默认颜色周期,因为它是默认颜色周期,因此仅使用它就足够了。

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

在此处输入图片说明

如果您想使用默认的颜色循环来进行其他操作,当然有几个选项。

“ tab10”颜色图

首先应该提到的是,"tab10"颜色图包含默认颜色周期中的颜色,您可以通过获取它cmap = plt.get_cmap("tab10")

因此,与上述等效

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

颜色循环中的颜色

您也可以直接使用颜色循环仪cycle = plt.rcParams['axes.prop_cycle'].by_key()['color']。这会列出循环中的颜色,您可以使用这些颜色进行迭代。

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

CN符号

最后,该CN符号允许获得N颜色周期的第一个颜色color="C{}".format(i)。但是,这仅适用于前10种颜色(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()

此处显示的所有代码都产生相同的图。


是否可以告诉matplotlib使用某种循环?必须遍历colors数组意味着您必须添加使用一个完整周期后返回索引0的逻辑。
Mehdi

@Mehdi当然,matplotlib确实使用了颜色循环。这个问题要求得到这个周期的颜色。
ImportanceOfBeingErnest

5
我认为CN符号在您的答案中应该更加突出,我几乎错过了。我怀疑绝大多数用例对只能访问前10种颜色感到满意,与'C1'朋友明确地传递道具循环相比,传递朋友的方式简直少了很多。
安德拉斯·迪克

3

重新使用CN符号

我想谈谈Matplotlib的新发展。在上一个答案中,我们阅读了

最后,该CN符号允许获得N颜色周期的第一个颜色color="C{}".format(i)。但是,这仅适用于前10种颜色(N in [0,1,...9]

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

在此处输入图片说明


2

如果您正在寻找一种快速的方法来获取matplotlib用于其线条的RGB颜色,则为:

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

或对于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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.