Solución:
Puede especificar el color
opción como una lista directamente a la plot
función.
from matplotlib import pyplot as plt
from itertools import cycle, islice
import pandas, numpy as np # I find np.random.randint to be better
# Make the data
x = [{i:np.random.randint(1,5)} for i in range(10)]
df = pandas.DataFrame(x)
# Make a list by cycling through the colors you care about
# to match the length of your data.
my_colors = list(islice(cycle(['b', 'r', 'g', 'y', 'k']), None, len(df)))
# Specify this list of colors as the `color` option to `plot`.
df.plot(kind='bar', stacked=True, color=my_colors)
Para definir su propia lista personalizada, puede hacer algunas de las siguientes acciones, o simplemente buscar las técnicas de Matplotlib para definir un elemento de color por sus valores RGB, etc. Puede complicarse tanto como quiera con esto.
my_colors = ['g', 'b']*5 # <-- this concatenates the list to itself 5 times.
my_colors = [(0.5,0.4,0.5), (0.75, 0.75, 0.25)]*5 # <-- make two custom RGBs and repeat/alternate them over all the bar elements.
my_colors = [(x/10.0, x/20.0, 0.75) for x in range(len(df))] # <-- Quick gradient example along the Red/Green dimensions.
El último ejemplo produce el siguiente degradado simple de colores para mí:
No jugué con él el tiempo suficiente para descubrir cómo forzar a la leyenda a recoger los colores definidos, pero estoy seguro de que puedes hacerlo.
Sin embargo, en general, un gran consejo es usar las funciones de Matplotlib directamente. Llamarlos desde Pandas está bien, pero creo que obtienes mejores opciones y rendimiento llamándolos directamente desde Matplotlib.
Encontré que la forma más fácil es usar el colormap
parámetro en .plot()
con uno de los degradados de color preestablecidos:
df.plot(kind='bar', stacked=True, colormap='Paired')
Puede encontrar una gran lista de mapas de colores preestablecidos aquí.
Para obtener una respuesta más detallada sobre cómo crear sus propios mapas de color, le sugiero que visite esta página.
Si esa respuesta es demasiado trabajo, puede hacer rápidamente su propia lista de colores y pasarlos al color
parámetro. Todos los mapas de colores están en el cm
módulo matplotlib. Obtengamos una lista de 30 valores de color RGB (más alfa) del mapa de colores inferno invertido. Para hacerlo, primero obtén el mapa de colores y luego pásale una secuencia de valores entre 0 y 1. Aquí, usamos np.linspace
para crear 30 valores igualmente espaciados entre .4 y .8 que representan esa parte del mapa de colores.
from matplotlib import cm
color = cm.inferno_r(np.linspace(.4, .8, 30))
color
array([[ 0.865006, 0.316822, 0.226055, 1. ],
[ 0.851384, 0.30226 , 0.239636, 1. ],
[ 0.832299, 0.283913, 0.257383, 1. ],
[ 0.817341, 0.270954, 0.27039 , 1. ],
[ 0.796607, 0.254728, 0.287264, 1. ],
[ 0.775059, 0.239667, 0.303526, 1. ],
[ 0.758422, 0.229097, 0.315266, 1. ],
[ 0.735683, 0.215906, 0.330245, 1. ],
.....
Entonces podemos usar esto para trazar, usando los datos de la publicación original:
import random
x = [{i: random.randint(1, 5)} for i in range(30)]
df = pd.DataFrame(x)
df.plot(kind='bar', stacked=True, color=color, legend=False, figsize=(12, 4))