Получить цветовой цикл линии по умолчанию

Я заметил, что когда вы строите график, первая строка будет синей, затем зеленой, затем красной и так далее.

Есть ли способ получить доступ к этому списку цветов? Я видел миллион постов о том, как изменить цветовой цикл или получить доступ к итератору, но не о том, как просто получить список цветов, которые циклически повторяет matplotlib по умолчанию.

2 ответа

Решение

В версиях 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']

В версиях < 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

Часто нет необходимости получать цветовой цикл по умолчанию из любого места, так как он является цветовым циклом по умолчанию, поэтому достаточно просто использовать его.

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

Все представленные здесь коды дают одинаковый сюжет.

Пересмотр обозначения 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()                                           

дает

Если вы ищете быстрый однострочный файл для получения цветов RGB, которые matplotlib использует для своих строк, вот он:

>>> 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)
Другие вопросы по тегам