Trazar datos categóricos con pandas y matplotlib


94

Tengo un marco de datos con datos categóricos:

     colour  direction
1    red     up
2    blue    up
3    green   down
4    red     left
5    red     right
6    yellow  down
7    blue    down

Quiero generar algunos gráficos, como gráficos circulares e histogramas basados ​​en las categorías. ¿Es posible sin crear variables numéricas ficticias? Algo como

df.plot(kind='hist')

Respuestas:


181

Simplemente puede usar value_countsen la serie:

df['colour'].value_counts().plot(kind='bar')

ingrese la descripción de la imagen aquí


1
Sugerir df["colour"].value_counts().plot(kind='bar')como alternativa común
openwonk

2
¿Es posible especificar el orden de las etiquetas x?
P. Camilleri

3
Sí, puede especificar el orden de las etiquetas x explícitamente, por ejemplodf['colour'].value_counts()[['green', 'yellow', 'blue', 'red']]
Alexander

¿Puede decirme cómo puedo hacer ajustes en esta trama? Quiero decir como si quisiera cambiar el color de cada clase o si quisiera agregarle una leyenda.
Ibtihaj Tahir

24

Puede encontrar una mosaictrama útil en statsmodels. Lo que también puede dar un resaltado estadístico para las variaciones.

from statsmodels.graphics.mosaicplot import mosaic
plt.rcParams['font.size'] = 16.0
mosaic(df, ['direction', 'colour']);

ingrese la descripción de la imagen aquí

Pero tenga cuidado con la celda de tamaño 0, ya que causarán problemas con las etiquetas.

Vea esta respuesta para más detalles


Gracias. Sigo recibiendo ValueError: No se puede convertir NA en entero.
Ivan

1
Por eso hice referencia a esta respuesta . Debería ayudar a abordar este problema.
Primer

19

Me gusta esto :

df.groupby('colour').size().plot(kind='bar')

11

También puede utilizar countplotfrom seaborn. Este paquete se basa en pandascrear una interfaz de trazado de alto nivel. Le ofrece un buen estilo y etiquetas de eje correctas de forma gratuita.

import pandas as pd
import seaborn as sns
sns.set()

df = pd.DataFrame({'colour': ['red', 'blue', 'green', 'red', 'red', 'yellow', 'blue'],
                   'direction': ['up', 'up', 'down', 'left', 'right', 'down', 'down']})
sns.countplot(df['colour'], color='gray')

ingrese la descripción de la imagen aquí

También admite colorear las barras en el color correcto con un pequeño truco.

sns.countplot(df['colour'],
              palette={color: color for color in df['colour'].unique()})

ingrese la descripción de la imagen aquí


10

Para trazar múltiples características categóricas como gráficos de barras en el mismo gráfico, sugeriría:

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame(
    {
        "colour": ["red", "blue", "green", "red", "red", "yellow", "blue"],
        "direction": ["up", "up", "down", "left", "right", "down", "down"],
    }
)

categorical_features = ["colour", "direction"]
fig, ax = plt.subplots(1, len(categorical_features))
for i, categorical_feature in enumerate(df[categorical_features]):
    df[categorical_feature].value_counts().plot("bar", ax=ax[i]).set_title(categorical_feature)
fig.show()

ingrese la descripción de la imagen aquí


1
¡Este es un gran efecto Stroop!
Ciprian Tomoiagă
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.