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')
Iván
fuente

Respuestas:

181

Simplemente puede usar value_countsen la serie:

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

ingrese la descripción de la imagen aquí

Alejandro
fuente
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

Cebador
fuente
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')
steboc
fuente
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í

Jarno
fuente
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í

Roman Orac
fuente
1
¡Este es un gran efecto Stroop!
Ciprian Tomoiagă