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


95

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

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

Ответы:


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 02

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 использовать какой-то цикл? Необходимость перебирать массив цветов означает, что вам нужно добавить логику для возврата к индексу 0 после использования одного полного цикла.
Мехди,

@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

если вы ищете быстрый однострочный текст для получения цветов 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)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.