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 iterator
bez 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_cycle
W 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_lines
instancji klasy pomocniczej. ax._get_lines
to dotyk myląco nazwany, ale to zakulisowa machina, która pozwala plot
komendzie przetwarzać wszystkie dziwne i różnorodne sposoby, które plot
można wywołać. Między innymi śledzi, jakie kolory mają być przypisane automatycznie. Podobnie można ax._get_patches_for_fill
kontrolować 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_cycle
linii i ax._get_patches_for_fill.color_cycle
łat. Na matplotlib> = 1.5 zmieniło się to, aby używać cycler
biblioteki , a iterowalna jest wywoływana prop_cycler
zamiast color_cycle
i daje dict
wł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.5
lub większym, byłoby miło uzyskać cycler
używany obiekt, ponieważ moglibyśmy wywnioskować jego aktualny stan. Jednak cycler
sam obiekt nie jest nigdzie dostępny (publicznie ani prywatnie). Zamiast tego dostępna jest tylko itertools.cycle
instancja utworzona z cycler
obiektu. 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.