Доступ к итератору цветового цикла
Не существует "ориентированного на пользователя" (также известного как "общедоступный") метода для доступа к базовому итератору, но вы можете получить к нему доступ через "частные" (по соглашению) методы. Однако вы не можете получить состояние, iteratorне изменив его.
Установка цветового цикла
Небольшое отступление: вы можете установить цикл цвет / свойство различными способами (например, ax.set_color_cycleв версиях <1.5 или ax.set_prop_cyclerв> = 1.5). Взгляните на пример здесь для версии 1.5 или выше или на предыдущий стиль здесь .
Доступ к базовому итератору
Однако, хотя нет общедоступного метода для доступа к итерируемому объекту, вы можете получить к нему доступ для данного объекта осей ( ax) через _get_linesэкземпляр вспомогательного класса. ax._get_lines- это прикосновение, название которого сбивает с толку, но это закулисный механизм, который позволяет plotкоманде обрабатывать все странные и разнообразные способы plotвызова. Среди прочего, это то, что отслеживает, какие цвета назначать автоматически. Точно так же ax._get_patches_for_fillможно контролировать циклическое переключение цветов заливки по умолчанию и свойств патча.
В любом случае, итеративный цветовой цикл предназначен ax._get_lines.color_cycleдля линий и ax._get_patches_for_fill.color_cycleдля участков. В matplotlib> = 1.5 это было изменено, чтобы использовать cyclerбиблиотеку , и итерация вызывается prop_cyclerвместо color_cycleи дает dictсвойство of вместо только цвета.
В общем, вы бы сделали что-то вроде:
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
color_cycle = ax._get_lines.color_cycle
Вы не можете просмотреть состояние iterator
Однако этот объект является «голым» iterator. Мы можем легко получить следующий элемент (например next_color = next(color_cycle), но это означает , что следующий цвет после этого является то , что будет построено. По дизайну, нет никакого способа , чтобы получить текущее состояние итератора , не изменяя его.
v1.5Было бы неплохо получить используемый cyclerобъект уровня In или выше, поскольку мы можем вывести его текущее состояние. Однако сам cyclerобъект нигде недоступен (публично или приватно). Вместо этого доступен только itertools.cycleэкземпляр, созданный из cyclerобъекта. В любом случае, нет никакого способа добраться до базового состояния циклера цвета / свойства.
Вместо этого сопоставьте цвет ранее нанесенного элемента
В вашем случае это похоже на то, что вы хотите сопоставить цвет с тем, что только что было нанесено. Вместо того, чтобы пытаться определить, каким будет цвет / свойство, установите цвет / и т. Д. Вашего нового элемента на основе свойств того, что отображается на графике.
Например, в описанном вами случае я бы сделал что-то вроде этого:
import matplotlib.pyplot as plt
import numpy as np
def custom_plot(x, y, **kwargs):
ax = kwargs.pop('ax', plt.gca())
base_line, = ax.plot(x, y, **kwargs)
ax.fill_between(x, 0.9*y, 1.1*y, facecolor=base_line.get_color(), alpha=0.5)
x = np.linspace(0, 1, 10)
custom_plot(x, x)
custom_plot(x, 2*x)
custom_plot(x, -x, color='yellow', lw=3)
plt.show()

Это не единственный способ, но в данном случае он чище, чем попытка получить цвет нанесенной линии заранее.