Получить цветовой цикл линии по умолчанию
Я заметил, что когда вы строите график, первая строка будет синей, затем зеленой, затем красной и так далее.
Есть ли способ получить доступ к этому списку цветов? Я видел миллион постов о том, как изменить цветовой цикл или получить доступ к итератору, но не о том, как просто получить список цветов, которые циклически повторяет 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)