Доступ к итератору цветового цикла
Не существует "ориентированного на пользователя" (также известного как "общедоступный") метода для доступа к базовому итератору, но вы можете получить к нему доступ через "частные" (по соглашению) методы. Однако вы не можете получить состояние, 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()
Это не единственный способ, но в данном случае он чище, чем попытка получить цвет нанесенной линии заранее.