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

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


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


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

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


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


1
C'est un super effet Stroop!
Ciprian Tomoiagă
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.