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.