Asignar colores de línea en pandas.

Estoy tratando de trazar algunos datos en pandas y la función de ttwig incorporada traza una línea por columna. Lo que quiero hacer es asignar manualmente a cada línea un color basado en una clasificación que hago.

Los siguientes trabajos:

df = pd.DataFrame({'1': [1, 2, 3, 4], '2': [1, 2, 1, 2]}) s = pd.Series(['c','y'], index=['1','2']) df.plot(color = s) 

Pero cuando mis índices son enteros, ya no funciona y se lanza como KeyError:

 df = pd.DataFrame({1: [1, 2, 3, 4], 2: [1, 2, 1, 2]}) s = pd.Series(['c','y'], index=[1,2]) df.plot(color = s) 

La forma en que lo entiendo es que cuando se usa un índice entero, de alguna manera tiene que comenzar desde 0. Esa es mi suposición, ya que también funciona lo siguiente:

 df = pd.DataFrame({0: [1, 2, 3, 4], 1: [1, 2, 1, 2]}) s = pd.Series(['c','y'], index=[1,0]) df.plot(color = s) 

Mi pregunta es:

  • ¿Que está sucediendo aquí?
  • Suponiendo que tengo un índice entero que no comienza desde 0 o no está formado por números sucesivos, ¿cómo puedo hacer que esto funcione sin tener que convertir el índice en cadena o reindexar desde 0?

EDITAR:

Me di cuenta de que incluso en el primer caso, el código no hace lo que esperaba que hiciera. Parece que los pandas coinciden con el índice de DataFrame y Series solo si ambos son índices enteros a partir de 0. Si ese no es el caso, se lanza un KeyError o si el índice es un orden del orden de los elementos.

¿Es esto correcto? ¿Y hay una manera de hacer coincidir los índices de Series y DataFrame? ¿O tengo que asegurarme de pasar una lista de colores en el orden correcto?

¿Que está sucediendo aquí?

El color del argumento de la palabra clave se hereda de matplotlib.pyplot.plot () . Los detalles en la documentación no dejan claro que se puede poner en una lista de colores al trazar. Dado que el color es un argumento de palabra clave de matplotlib, recomendaría no usar una serie Pandas para mantener los valores de color.

¿Cómo puedo hacer que esto funcione?

Use una lista en lugar de una serie. Si estaba usando una Serie con un índice destinado a hacer coincidir las columnas de su DataFrame con colores específicos, primero deberá ordenar la Serie. Si las columnas no están en orden, también deberá ordenar las columnas .

 # Option 1 s = s.sort_index() df.plot(color = s.values) # as per Fiabetto's answer # Option 2 df.plot(color = ['c', 'y']) # other method 

Tratar:

 df.plot(color = s.values) 

Esto asignará los colores sin importar la escala del índice.

EDITAR:

Lo intenté con tres columnas:

 df = pd.DataFrame({'1': [1, 2, 3, 4], '2': [1, 2, 1, 2], '3': [4, 3, 2, 1]}) s = pd.Series(['c','y','r'], index=[1,3,2]) df.plot(color = s.sort_index().values) 

Y clasificando la serie funciona.