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.