Zeichnen von kategorialen Daten mit Pandas und Matplotlib


90

Ich habe einen Datenrahmen mit kategorialen Daten:

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

Ich möchte einige Diagramme wie Kreisdiagramme und Histogramme basierend auf den Kategorien generieren. Ist es möglich, ohne numerische Dummy-Variablen zu erstellen? Etwas wie

df.plot(kind='hist')

Antworten:


174

Sie können einfach value_countsfür die Serie verwenden:

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

Geben Sie hier die Bildbeschreibung ein


1
Was darauf hindeutet , df["colour"].value_counts().plot(kind='bar')als übliche Alternative
— openwonk

2
Ist es möglich, die Reihenfolge der x-Beschriftungen anzugeben?
— P. Camilleri

3
Ja, Sie können die Reihenfolge der x-Labels explizit angeben, z. B.df['colour'].value_counts()[['green', 'yellow', 'blue', 'red']]
— Alexander

Können Sie mir bitte sagen, wie ich Anpassungen an dieser Handlung vornehmen kann? Ich meine, wenn ich die Farbe für jede Klasse ändern oder eine Legende hinzufügen möchte.
— Ibtihaj Tahir

24

Möglicherweise finden Sie nützliche mosaicDiagramme aus Statistikmodellen. Dies kann auch zu statistischen Hervorhebungen für die Abweichungen führen.

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

Geben Sie hier die Bildbeschreibung ein

Achten Sie jedoch auf die Zelle mit der Größe 0 - sie verursacht Probleme mit Etiketten.

Siehe diese Antwort für Details


Vielen Dank. Ich erhalte immer wieder ValueError: NA kann nicht in eine Ganzzahl konvertiert werden.
— Ivan

1
Deshalb habe ich auf diese Antwort verwiesen . Es sollte helfen, dieses Problem zu beheben.
— Grundierung

19

so was :

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

11

Sie können auch countplotvon verwenden seaborn. Dieses Paket baut auf pandaseiner Plot-Oberfläche auf hoher Ebene auf. Sie erhalten kostenlos ein gutes Styling und korrekte Achsenbeschriftungen.

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

Geben Sie hier die Bildbeschreibung ein

Es unterstützt auch das Färben der Balken in der richtigen Farbe mit einem kleinen Trick

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

Geben Sie hier die Bildbeschreibung ein


9

Um mehrere kategoriale Features als Balkendiagramme auf demselben Plot darzustellen, würde ich Folgendes vorschlagen:

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

Geben Sie hier die Bildbeschreibung ein


1
Dies ist ein großartiger Stroop-Effekt!
— Ciprian Tomoiagă
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.