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

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

Alexander
quelle
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

Grundierung
quelle
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')
steboc
quelle
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

Jarno
quelle
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

Roman Orac
quelle
1
Dies ist ein großartiger Stroop-Effekt!
Ciprian Tomoiagă