Подтвердить что ты не робот

Построение различных цветов в matplotlib

Предположим, что у меня есть цикл for, и я хочу нарисовать точки разных цветов:

for i in range(5):
 plt.plot(x,y,col=i)

Как автоматически изменить цвета в цикле for?

4b9b3361

Ответ 1

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

enter image description here

Если вы хотите контролировать циклы, через которые проходит 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()

enter image description here

Если вы хотите явно указать цвета, которые будут использоваться, просто передайте его 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()

enter image description here

Наконец, если вы хотите автоматически выбрать указанное количество цветов из существующей карты цветов:

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

enter image description here

Ответ 2

for color in ['r', 'b', 'g', 'k', 'm']:
    plot(x, y, color=color)

Ответ 3

Отличный ответ Джо Кингтона - уже 4 года, Matplotlib постепенно менялся (в частности, введен модуль cycler), а в новом основном выпуске Matplotlib 2.0.x появились стилистические различия, которые важны с точки зрения цвета, используемые по умолчанию.

Цвет отдельных линий

Цвет отдельных линий (а также цвет различных элементов графика, например маркеров на точечных диаграммах) определяется аргументом ключевого слова color,

plt.plot(x, y, color=my_color)

my_color либо

Цветовой цикл

По умолчанию разные линии отображаются разными цветами, которые определены по умолчанию и используются циклически (отсюда и название цветового цикла).

Цикл цвета является свойством объекта axes, и в более ранних версиях это была просто последовательность допустимых имен цветов (по умолчанию это строка имен цветов одного символа, "bgrcmyk"), и вы можете установить ее так, как в

my_ax.set_color_cycle(['kbkykrkg'])

(как отмечено в комментарии, этот API устарел, подробнее об этом позже).

В Matplotlib 2.0 цветовой цикл по умолчанию: ["#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd", "#8c564b", "#e377c2", "#7f7f7f", "#bcbd22", "#17becf"], палитра Vega category10.

enter image description here

(изображение - скриншот с 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(), а также примеры можно найти в подробных документах.