Tracer des données catégoriques avec les pandas et matplotlib

94

J'ai un bloc de données avec des données catégorielles:

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

Je souhaite générer des graphiques, comme des camemberts et des histogrammes basés sur les catégories. Est-ce possible sans créer de variables numériques factices? Quelque chose comme

df.plot(kind='hist')
Ivan
la source

Réponses:

181

Vous pouvez simplement utiliser value_countssur la série:

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

entrez la description de l'image ici

Alexandre
la source
1
Suggérer df["colour"].value_counts().plot(kind='bar')comme alternative courante
openwonk
2
Est-il possible de spécifier l'ordre des x étiquettes?
P. Camilleri
3
Oui, vous pouvez spécifier l'ordre des étiquettes x explicitement, par exempledf['colour'].value_counts()[['green', 'yellow', 'blue', 'red']]
Alexander
Pouvez-vous me dire comment puis-je faire des ajustements à ce graphique. Je veux dire, comme si je veux changer la couleur de chaque classe ou si je veux y ajouter une légende.
Ibtihaj Tahir
24

Vous pouvez trouver des mosaicgraphiques utiles à partir de statsmodels. Ce qui peut également donner une mise en évidence statistique des variances.

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

entrez la description de l'image ici

Mais méfiez-vous des cellules de taille 0 - elles poseront des problèmes avec les étiquettes.

Voir cette réponse pour plus de détails

Apprêt
la source
Merci. Je continue à recevoir ValueError: Impossible de convertir NA en entier dessus.
Ivan le
1
C'est pourquoi j'ai fait référence à cette réponse . Cela devrait aider à résoudre ce problème.
Introduction du
19

comme ça :

df.groupby('colour').size().plot(kind='bar')
steboc
la source
11

Vous pouvez également utiliser countplotfrom seaborn. Ce package s'appuie sur pandaspour créer une interface de traçage de haut niveau. Il vous donne un bon style et des étiquettes d'axe correctes gratuitement.

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

entrez la description de l'image ici

Il prend également en charge la coloration des barres de la bonne couleur avec une petite astuce

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

entrez la description de l'image ici

Jarno
la source
10

Pour tracer plusieurs caractéristiques catégorielles sous forme de graphiques à barres sur le même tracé, je suggérerais:

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

entrez la description de l'image ici

Orac romain
la source
1
C'est un super effet Stroop!
Ciprian Tomoiagă