Restablecer ciclo de color en Matplotlib

Digamos que tengo datos sobre 3 estrategias comerciales, cada una con y sin costos de transacción. Quiero trazar, en los mismos ejes, las series de tiempo de cada una de las 6 variantes (3 estrategias * 2 costos de negociación). Me gustaría que las líneas “con costo de transacción” se representaran con alpha=1 y el linewidth=1 mientras que quiero que los “sin costos de transacción” se representen con alpha=0.25 y el linewidth=5 . Pero me gustaría que el color fuera el mismo para ambas versiones de cada estrategia.

Me gustaría algo en la línea de:

 fig, ax = plt.subplots(1, 1, figsize=(10, 10)) for c in with_transaction_frame.columns: ax.plot(with_transaction_frame[c], label=c, alpha=1, linewidth=1) ****SOME MAGIC GOES HERE TO RESET THE COLOR CYCLE for c in no_transaction_frame.columns: ax.plot(no_transaction_frame[c], label=c, alpha=0.25, linewidth=5) ax.legend() 

¿Cuál es el código apropiado para colocar en la línea indicada para restablecer el ciclo de color de modo que sea “volver al inicio” cuando se invoca el segundo bucle?

Puede restablecer el colorcycle al original con Axes.set_color_cycle . Mirando el código para esto, hay una función para hacer el trabajo real:

 def set_color_cycle(self, clist=None): if clist is None: clist = rcParams['axes.color_cycle'] self.color_cycle = itertools.cycle(clist 

Y un método sobre los Ejes que lo utiliza:

 def set_color_cycle(self, clist): """ Set the color cycle for any future plot commands on this Axes. *clist* is a list of mpl color specifiers. """ self._get_lines.set_color_cycle(clist) self._get_patches_for_fill.set_color_cycle(clist) 

Básicamente, esto significa que puede llamar a set_color_cycle con Ninguno como el único argumento, y se reemplazará con el ciclo predeterminado que se encuentra en rcParams [‘axes.color_cycle’].

Intenté esto con el siguiente código y obtuve el resultado esperado:

 import matplotlib.pyplot as plt import numpy as np for i in range(3): plt.plot(np.arange(10) + i) # for Matplotlib version < 1.5 plt.gca().set_color_cycle(None) # for Matplotlib version >= 1.5 plt.gca().set_prop_cycle(None) for i in range(3): plt.plot(np.arange(10, 1, -1) + i) plt.show() 

Salida de código, que muestra la funcionalidad de reinicio del ciclo de color

Como la respuesta dada por @pelson usa set_color_cycle y esto está en desuso en Matplotlib 1.5, pensé que sería útil tener una versión actualizada de su solución usando set_prop_cycle :

 import matplotlib.pyplot as plt import numpy as np for i in range(3): plt.plot(np.arange(10) + i) plt.gca().set_prop_cycle(None) for i in range(3): plt.plot(np.arange(10, 0, -1) + i) plt.show() 

Tenga en cuenta también que tuve que cambiar np.arange(10,1,-1) a np.arange(10,0,-1) . El primero dio una serie de solo 9 elementos. Esto probablemente se debe al uso de diferentes versiones de Numpy. El mío es 1.10.2.

EDITAR : Se eliminó la necesidad de usar rcParams . Gracias a @divenex por señalarlo en un comentario.

Como mencionó que está utilizando el transporte por mar, lo que recomendaría hacer es:

 with sns.color_palette(n_colors=3): ax.plot(...) ax.plot(...) 

Esto configurará la paleta de colores para usar el ciclo de color activo actualmente, pero solo los primeros tres colores de ella. También es una solución de propósito general para cualquier momento que desee establecer un ciclo de color temporal.

Tenga en cuenta que lo único que realmente debe estar debajo del bloque with es lo que esté haciendo para crear el objeto Axes (es decir, fig.add_subplot() , fig.add_subplot() , etc.). Esto se debe a cómo funciona el ciclo de color de matplotlib.

Hacer lo que desea específicamente, “restablecer” el ciclo de color, es posible, pero es un truco y no lo haría en ningún tipo de código de producción. Aquí, sin embargo, es cómo podría suceder:

 f, ax = plt.subplots() ax.plot(np.random.randn(10, 3)) ax._get_lines.color_cycle = itertools.cycle(sns.color_palette()) ax.plot(np.random.randn(10, 3), lw=5, alpha=.25) 

introduzca la descripción de la imagen aquí

Puede obtener los colores de los marinos de esta manera: colors = sns.color_palette() . La respuesta de Ffisegydd funcionaría muy bien. También puede obtener el color para trazar utilizando el módulo / rest operater (%): mycolor = colors[icolumn % len(colors] . Yo uso este enfoque a menudo por mí mismo. Así que puede hacer:

for icol, column in enumerate(with_transaction_frame.columns): mycolor = colors[icol % len(colors] ax.plot(with_transaction_frame[col], label=col, alpha=1.0, color=mycolor)

Sin embargo, la respuesta de Ffisegydd puede ser más “pythonica”.

Simplemente elija sus colores y asígnelos a una lista, luego, al trazar su iteración de datos sobre un objeto zip que contiene su columna y el color que desea.

 colors = ['red', 'blue', 'green'] for col, color in zip(colors, with_transaction_frame.columns): ax.plot(with_transaction_frame[col], label=col, alpha=1.0, linewidth=1.0, color=color) for col, color in zip(no_transaction_frame.columns): ax.plot(no_transaction_frame[col], label=col, alpha=0.25, linewidth=5, color=color) 

zip crea una lista que agrega los elementos de cada una de sus listas. Esto le permite iterar sobre ambos fácilmente al mismo tiempo.