Saltar al contenido

Cómo dar colores personalizados a un gráfico de barras de pandas / matplotlib

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í:

ingrese la descripción de la imagen aquí

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')

ingrese la descripción de la imagen aquí

Puede encontrar una gran lista de mapas de colores preestablecidos aquí.

mapas de colores

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))

ingrese la descripción de la imagen aquí

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *