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 iteratorsin 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_cycleen las versiones <1.5 o ax.set_prop_cycleren> = 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_linesinstancia de la clase auxiliar. ax._get_lineses un toque de nombre confuso, pero es la maquinaria detrás de escena la que permite que el plotcomando procese todas las formas extrañas y variadas que plotse 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_fillque 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_cyclepara líneas y ax._get_patches_for_fill.color_cycleparches. En matplotlib> = 1.5, esto ha cambiado para usar la cyclerbiblioteca , y se llama al iterable en prop_cyclerlugar de color_cycley produce una dictde 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.5o superior, sería bueno obtener el cyclerobjeto que se usa, ya que podríamos inferir su estado actual. Sin embargo, el cyclerobjeto en sí no es accesible (de forma pública o privada) en ninguna parte. En cambio, solo se puede acceder a la itertools.cycleinstancia creada a partir del cyclerobjeto. 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.