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