Ir al siguiente color de ax._get_lines.prop_cycler.next () continuamente por bucle

Quiero usar el siguiente color para cada trazado que trazo for bucle. Pero cuando llamo ax1._get_lines.prop_cycler.next() , no puede ir al tercer color. ¿Cómo hacer algo como .next().next() o ax1._get_lines.prop_cycler.next()[k] en la línea de bucle usando k in xrange() ?

 a = np.cumsum(np.cumsum(np.random.randn(7,4), axis=0), axis=1) lab = np.array(["A","B","C","E"]) for k in xrange(4): ax1 = plt.subplot2grid((4, 1), (k, 0), rowspan=1, colspan=4) ax1._get_lines.prop_cycler.next() ax1.plot(a[:,k]) plt.legend(labels=lab[k:k+1]) plt.show() 

introduzca la descripción de la imagen aquí

En el código de la pregunta, cada subttwig tiene su propio ciclo de color, de modo que a next le da el segundo color del ciclo de color de los ejes en cada subttwig.

Una solución sería compartir el mismo ciclo de color entre todas las subplots.

Para el caso en el que cree las subplots dentro del bucle, puede usar

 import matplotlib.pyplot as plt import numpy as np a = np.cumsum(np.cumsum(np.random.randn(7,4), axis=0), axis=1) lab = np.array(["A","B","C","E"]) for k in xrange(4): ax1 = plt.subplot2grid((4, 1), (k, 0)) if k==0: c = ax1._get_lines.prop_cycler else: ax1._get_lines.prop_cycler = c ax1.plot(a[:,k]) plt.legend(labels=lab[k:k+1]) plt.show() 

O en el caso de que se creen subplots todos a la vez,

 import matplotlib.pyplot as plt import numpy as np a = np.cumsum(np.cumsum(np.random.randn(7,4), axis=0), axis=1) lab = np.array(["A","B","C","E"]) fig, axes = plt.subplots(4,1) for k, ax in enumerate(axes): ax._get_lines.prop_cycler = axes[0]._get_lines.prop_cycler ax.plot(a[:,k]) ax.legend(labels=lab[k]) plt.show() 

Por supuesto, también puede usar el ciclador de color de cada eje individualmente y propagarlo al siguiente color.

 import matplotlib.pyplot as plt import numpy as np a = np.cumsum(np.cumsum(np.random.randn(7,4), axis=0), axis=1) lab = np.array(["A","B","C","E"]) fig, axes = plt.subplots(4,1) for k, ax in enumerate(axes): for i in range(k): next(ax._get_lines.prop_cycler) ax.plot(a[:,k]) ax.legend(labels=lab[k]) plt.show() 

En todos los casos el resultado se vería así:

introduzca la descripción de la imagen aquí

El problema con su código es que crea una nueva instancia de ejes en cada bucle y luego hace ax1._get_lines.prop_cycler.next() . Como ax1 es un objeto nuevo cada vez, siempre obtienes el mismo color.

La mejor solución es pasar explícitamente el color a la ttwig. Debería poder obtener lo que desea con el siguiente código, inspirado en este ejemplo :

 import numpy as np import matplotlib.pyplot as plt a = np.cumsum(np.cumsum(np.random.randn(7,4), axis=0), axis=1) lab = np.array(["A","B","C","E"]) colors = plt.rcParams['axes.prop_cycle'] colors = colors.by_key()['color'] for (k, label), color in zip(enumerate(lab), colors): ax1 = plt.subplot2grid((4, 1), (k, 0), rowspan=1, colspan=4) ax1.plot(a[:,k], color=color) plt.legend(labels=label) plt.show() 

Nota : mi versión del código también evita xrange y el método next() que falla en python3.


Una advertencia: en tu ejemplo, usas ax1._get_lines . Por lo general, los nombres que comienzan con un guión bajo se consideran privados: por lo tanto, los desarrolladores de matplotlib pueden cambiar o eliminar el atributo _get_lines en cualquier momento sin previo aviso y romper su código. Le sugiero que haga uso de la API pública tanto como sea posible.