Dostęp do iteratora cyklu kolorów
Nie ma metody „widocznej dla użytkownika” (aka „publicznej”), aby uzyskać dostęp do bazowego iteratora, ale można uzyskać do niego dostęp za pomocą metod „prywatnych” (zgodnie z konwencją). Jednak nie można uzyskać stanu iteratorbez zmiany.
Ustawianie cyklu kolorów
Krótko na bok: cykl koloru / właściwości można ustawić na różne sposoby (np. ax.set_color_cycleW wersjach <1.5 lub ax.set_prop_cycler> = 1.5). Spójrz na przykład tutaj dla wersji 1.5 lub nowszej lub do poprzedniego stylu tutaj .
Dostęp do bazowego iteratora
Jednakże, chociaż nie ma publicznej metody dostępu do iterowalnej metody, możesz uzyskać do niej dostęp dla danego obiektu axes ( ax) za pośrednictwem _get_linesinstancji klasy pomocniczej. ax._get_linesto dotyk myląco nazwany, ale to zakulisowa machina, która pozwala plotkomendzie przetwarzać wszystkie dziwne i różnorodne sposoby, które plotmożna wywołać. Między innymi śledzi, jakie kolory mają być przypisane automatycznie. Podobnie można ax._get_patches_for_fillkontrolować przełączanie między domyślnymi kolorami wypełnienia i właściwościami łat.
W każdym razie iterowalny cykl kolorów dotyczy ax._get_lines.color_cyclelinii i ax._get_patches_for_fill.color_cyclełat. Na matplotlib> = 1.5 zmieniło się to, aby używać cyclerbiblioteki , a iterowalna jest wywoływana prop_cyclerzamiast color_cyclei daje dictwłaściwości zamiast tylko koloru.
Podsumowując, zrobiłbyś coś takiego:
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
color_cycle = ax._get_lines.color_cycle
Nie możesz wyświetlić stanu pliku iterator
Jednak przedmiot ten jest „goły” iterator. Możemy łatwo uzyskać następny element (np. next_color = next(color_cycle)Ale to oznacza, że następny kolor po nim jest tym, co zostanie naniesione. Zgodnie z projektem nie ma możliwości uzyskania aktualnego stanu iteratora bez zmiany go.
W v1.5lub większym, byłoby miło uzyskać cyclerużywany obiekt, ponieważ moglibyśmy wywnioskować jego aktualny stan. Jednak cyclersam obiekt nie jest nigdzie dostępny (publicznie ani prywatnie). Zamiast tego dostępna jest tylko itertools.cycleinstancja utworzona z cyclerobiektu. Tak czy inaczej, nie ma sposobu, aby dostać się do podstawowego stanu cyklera kolorów / właściwości.
Zamiast tego dopasuj kolor wydrukowanego wcześniej przedmiotu
W twoim przypadku brzmi to tak, jakbyś chciał dopasować kolor do czegoś, co właśnie zostało wykreślone. Zamiast próbować określić, jaki będzie kolor / właściwość, ustaw kolor / itp. Nowego elementu na podstawie właściwości wykreślonego elementu.
Na przykład w przypadku, który opisałeś, zrobiłbym coś takiego:
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()

To nie jedyny sposób, ale jest czystszy niż próba wcześniejszego uzyskania koloru kreślonej linii, w tym przypadku.