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')
Ivan
źródło

Odpowiedzi:

182

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

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

wprowadź opis obrazu tutaj

Aleksandra
źródło
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

Elementarz
źródło
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
19

lubię to :

df.groupby('colour').size().plot(kind='bar')
steboc
źródło
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

Jarno
źródło
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

Roman Orac
źródło
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

msenior_
źródło