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

Це не єдиний спосіб, але чистіший, ніж спроба отримати колір накресленої лінії заздалегідь, у цьому випадку.