Wykreślanie danych kategorycznych za pomocą pand i matplotlib


95

Mam ramkę danych z danymi kategorycznymi:

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

Chcę wygenerować wykresy, takie jak wykresy kołowe i histogramy na podstawie kategorii. Czy jest to możliwe bez tworzenia fikcyjnych zmiennych numerycznych? Coś jak

df.plot(kind='hist')

Odpowiedzi:


182

Możesz po prostu użyć value_countsw serii:

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

wprowadź opis obrazu tutaj


1
Sugerowanie df["colour"].value_counts().plot(kind='bar')jako powszechna alternatywa
openwonk

2
Czy można określić kolejność etykiet x?
P. Camilleri,

3
Tak, możesz wyraźnie określić kolejność etykiet x, np.df['colour'].value_counts()[['green', 'yellow', 'blue', 'red']]
Alexander

Czy możesz mi powiedzieć, jak mogę zmienić tę fabułę. Chodzi mi o to, że chcę zmienić kolor dla każdej klasy lub dodać do niej legendę.
Ibtihaj Tahir

24

Możesz znaleźć przydatne mosaicwykresy z modeli statystycznych. Co może również dać statystyczne wyróżnienie dla wariancji.

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

wprowadź opis obrazu tutaj

Uważaj jednak na komórkę o rozmiarze 0 - spowodują problemy z etykietami.

Zobacz tę odpowiedź, aby uzyskać szczegółowe informacje


Dzięki. Ciągle otrzymuję ValueError: Nie można przekonwertować NA na liczbę całkowitą.
Ivan

1
Dlatego odniosłem się do tej odpowiedzi . Powinno to pomóc w rozwiązaniu tego problemu.
Elementarz


12

Możesz również użyć countplotfrom seaborn. Ten pakiet jest oparty na pandastworzeniu interfejsu drukowania wysokiego poziomu. Zapewnia dobrą stylizację i prawidłowe etykiety osi za darmo.

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

wprowadź opis obrazu tutaj

Obsługuje również malowanie pasków w odpowiednim kolorze za pomocą małej sztuczki

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

wprowadź opis obrazu tutaj


Cześć. Jak mogę zmodyfikować nazwy zmiennej, np. Mam prawie 10 kategorii zmiennej i kiedy robię ten wykres, nazwy nakładają się na siebie. Co mogę zrobić, żeby tak się nie stało? Powinienem zwiększyć rozmiar fig czy coś?
Mahreen Athar

10

Aby wykreślić wiele cech kategorialnych jako wykresy słupkowe na tym samym wykresie, sugerowałbym:

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

wprowadź opis obrazu tutaj


1
To wspaniały efekt Stroopa!
Ciprian Tomoiagă

0

Możesz po prostu użyć value_countsz sortopcją ustawioną na False. Pozwoli to zachować kolejność kategorii

df['colour'].value_counts(sort=False).plot.bar(rot=0)

link do obrazu

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.