Accediendo al iterador del ciclo de color
No hay un método "de cara al usuario" (también conocido como "público") para acceder al iterador subyacente, pero puede acceder a él a través de métodos "privados" (por convención). Sin embargo, no puede obtener el estado de un iterator
sin cambiarlo.
Configurar el ciclo de color
Un aparte rápido: puede establecer el ciclo de color / propiedad de varias formas (por ejemplo, ax.set_color_cycle
en las versiones <1.5 o ax.set_prop_cycler
en> = 1.5). Eche un vistazo al ejemplo aquí para la versión 1.5 o superior , o al estilo anterior aquí .
Accediendo al iterador subyacente
Sin embargo, aunque no existe un método de cara al público para acceder al iterable, puede acceder a él para un objeto de ejes determinado ( ax
) a través de la _get_lines
instancia de la clase auxiliar. ax._get_lines
es un toque de nombre confuso, pero es la maquinaria detrás de escena la que permite que el plot
comando procese todas las formas extrañas y variadas que plot
se pueden llamar. Entre otras cosas, es lo que realiza un seguimiento de los colores que se asignan automáticamente. Del mismo modo, hay ax._get_patches_for_fill
que controlar el ciclo a través de los colores de relleno predeterminados y las propiedades del parche.
En cualquier caso, el ciclo de color iterable es ax._get_lines.color_cycle
para líneas y ax._get_patches_for_fill.color_cycle
parches. En matplotlib> = 1.5, esto ha cambiado para usar la cycler
biblioteca , y se llama al iterable en prop_cycler
lugar de color_cycle
y produce una dict
de propiedades en lugar de solo un color.
Con todo, harías algo como:
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
color_cycle = ax._get_lines.color_cycle
No puede ver el estado de un iterator
Sin embargo, este objeto es un "desnudo" iterator
. Podemos obtener fácilmente el siguiente elemento (por ejemplo next_color = next(color_cycle)
, pero eso significa que el siguiente color después de ese es el que se trazará. Por diseño, no hay forma de obtener el estado actual de un iterador sin cambiarlo.
En v1.5
o superior, sería bueno obtener el cycler
objeto que se usa, ya que podríamos inferir su estado actual. Sin embargo, el cycler
objeto en sí no es accesible (de forma pública o privada) en ninguna parte. En cambio, solo se puede acceder a la itertools.cycle
instancia creada a partir del cycler
objeto. De cualquier manera, no hay forma de llegar al estado subyacente del ciclador de color / propiedad.
En su lugar, haga coincidir el color del elemento trazado anteriormente
En su caso, parece que desea hacer coincidir el color de algo que acaba de trazar. En lugar de intentar determinar cuál será el color / propiedad, establezca el color / etc. de su nuevo elemento en función de las propiedades de lo que se trazó.
Por ejemplo, en el caso que describiste, haría algo como esto:
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()
No es la única forma, pero es más limpia que intentar obtener el color de la línea trazada de antemano, en este caso.