Предположим, что у меня есть цикл for, и я хочу нарисовать точки разных цветов:
for i in range(5):
plt.plot(x,y,col=i)
Как автоматически изменить цвета в цикле for?
Предположим, что у меня есть цикл for, и я хочу нарисовать точки разных цветов:
for i in range(5):
plt.plot(x,y,col=i)
Как автоматически изменить цвета в цикле for?
@tcaswell уже ответил, но я как раз набирал ответ, поэтому я опубликую его...
Есть несколько разных способов сделать это. Для начала, matplotlib
автоматически переключается между цветами. По умолчанию, он проходит через синий, зеленый, красный, голубой, пурпурный, желтый, черный:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 1, 10)
for i in range(1, 6):
plt.plot(x, i * x + i, label='$y = {i}x + {i}$'.format(i=i))
plt.legend(loc='best')
plt.show()
Если вы хотите контролировать циклы, через которые проходит matplotlib, используйте ax.set_color_cycle
:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 1, 10)
fig, ax = plt.subplots()
ax.set_color_cycle(['red', 'black', 'yellow'])
for i in range(1, 6):
plt.plot(x, i * x + i, label='$y = {i}x + {i}$'.format(i=i))
plt.legend(loc='best')
plt.show()
Если вы хотите явно указать цвета, которые будут использоваться, просто передайте его color
kwarg (имена цветов html принимаются, как и кортежи rgb и шестнадцатеричные строки):
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 1, 10)
for i, color in enumerate(['red', 'black', 'blue', 'brown', 'green'], start=1):
plt.plot(x, i * x + i, color=color, label='$y = {i}x + {i}$'.format(i=i))
plt.legend(loc='best')
plt.show()
Наконец, если вы хотите автоматически выбрать указанное количество цветов из существующей карты цветов:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 1, 10)
number = 5
cmap = plt.get_cmap('gnuplot')
colors = [cmap(i) for i in np.linspace(0, 1, number)]
for i, color in enumerate(colors, start=1):
plt.plot(x, i * x + i, color=color, label='$y = {i}x + {i}$'.format(i=i))
plt.legend(loc='best')
plt.show()
for color in ['r', 'b', 'g', 'k', 'm']:
plot(x, y, color=color)
Отличный ответ Джо Кингтона - уже 4 года, Matplotlib постепенно менялся (в частности, введен модуль cycler
), а в новом основном выпуске Matplotlib 2.0.x появились стилистические различия, которые важны с точки зрения цвета, используемые по умолчанию.
Цвет отдельных линий (а также цвет различных элементов графика, например маркеров на точечных диаграммах) определяется аргументом ключевого слова color
,
plt.plot(x, y, color=my_color)
my_color
либо
(0.,0.5,0.5)
),"#008080"
(RGB) или "#008080A0"
),"k"
для черного, возможные значения в "bgrcmykw"
),"teal"
) --- так называемое имя цвета HTML (в документах также название цвета X11/CSS4),'xkcd:'
(например, 'xkcd:barbie pink'
),'T10'
по умолчанию (например, 'tab:blue'
, 'tab:olive'
),"C3"
, то есть буква "C"
за которой следует одна цифра в "0-9"
).По умолчанию разные линии отображаются разными цветами, которые определены по умолчанию и используются циклически (отсюда и название цветового цикла).
Цикл цвета является свойством объекта axes
, и в более ранних версиях это была просто последовательность допустимых имен цветов (по умолчанию это строка имен цветов одного символа, "bgrcmyk"
), и вы можете установить ее так, как в
my_ax.set_color_cycle(['kbkykrkg'])
(как отмечено в комментарии, этот API устарел, подробнее об этом позже).
В Matplotlib 2.0 цветовой цикл по умолчанию: ["#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd", "#8c564b", "#e377c2", "#7f7f7f", "#bcbd22", "#17becf"]
, палитра Vega category10.
(изображение - скриншот с https://vega.github.io/vega/docs/schemes/)
Следующий код показывает, что понятие цветового цикла устарело
In [1]: from matplotlib import rc_params
In [2]: rc_params()['axes.color_cycle']
/home/boffi/lib/miniconda3/lib/python3.6/site-packages/matplotlib/__init__.py:938: UserWarning: axes.color_cycle is deprecated and replaced with axes.prop_cycle; please use the latter.
warnings.warn(self.msg_depr % (key, alt_key))
Out[2]:
['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd',
'#8c564b', '#e377c2', '#7f7f7f', '#bcbd22', '#17becf']
Теперь соответствующим свойством является 'axes.prop_cycle'
In [3]: rc_params()['axes.prop_cycle']
Out[3]: cycler('color', ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd', '#8c564b', '#e377c2', '#7f7f7f', '#bcbd22', '#17becf'])
Раньше color_cycle
представлял собой общую последовательность допустимых цветовых обозначений, теперь по умолчанию это cycler
объект, содержащий метку ('color'
) и последовательность допустимых цветовых обозначений. Шаг вперед по сравнению с предыдущим интерфейсом состоит в том, что можно циклически переключаться не только на цвет линий, но и на другие атрибуты строк, например,
In [5]: from cycler import cycler
In [6]: new_prop_cycle = cycler('color', ['k', 'r']) * cycler('linewidth', [1., 1.5, 2.])
In [7]: for kwargs in new_prop_cycle: print(kwargs)
{'color': 'k', 'linewidth': 1.0}
{'color': 'k', 'linewidth': 1.5}
{'color': 'k', 'linewidth': 2.0}
{'color': 'r', 'linewidth': 1.0}
{'color': 'r', 'linewidth': 1.5}
{'color': 'r', 'linewidth': 2.0}
Как вы уже видели, cycler
объекты компонуемы и когда вы итерацию по составленной cycler
, что вы получите, на каждой итерации, является словарь ключевых аргументов для plt.plot
.
Вы можете использовать новые значения по умолчанию для соотношения объектов на axes
,
my_ax.set_prop_cycle(new_prop_cycle)
или вы можете временно установить новый по умолчанию
plt.rc('axes', prop_cycle=new_prop_cycle)
или измените по умолчанию редактирование файла .matplotlibrc
.
Последняя возможность, используйте менеджер контекста
with plt.rc_context({'axes.prop_cycle': new_prop_cycle}):
...
чтобы новый cycler
использовался в группе разных графиков, возвращаясь к значениям по умолчанию в конце контекста.
Строка документа для функции cycler()
полезна, но подробности (не так много) о модуле cycler
и функции cycler()
, а также примеры можно найти в подробных документах.