Побудова категоріальних даних за допомогою панд та matplotlib


94

У мене є фрейм даних з категоричними даними:

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

Я хочу сформувати декілька графіків, таких як кругові діаграми та гістограми на основі категорій. Чи можливо це без створення фіктивних числових змінних? Щось на зразок

df.plot(kind='hist')

Відповіді:


181

Ви можете просто використовувати value_countsдля серії:

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

введіть тут опис зображення


1
Пропонуємо df["colour"].value_counts().plot(kind='bar')як загальну альтернативу
openwonk

2
Чи можна вказати порядок міток x?
P. Camilleri

3
Так, ви можете чітко вказати порядок міток x, наприкладdf['colour'].value_counts()[['green', 'yellow', 'blue', 'red']]
Олександр

Скажіть, будь ласка, як я можу внести корективи в цей сюжет. Я маю на увазі, якби я хотів змінити колір для кожного класу або хотів би додати до нього легенду.
Ібтіхай Тахір

24

Ви можете знайти корисний mosaicсюжет зі статистичних моделей. Що також може дати статистичне виділення для дисперсій.

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

введіть тут опис зображення

Але остерігайтеся комірки розміром 0 - вони спричинять проблеми з мітками.

Дивіться цей відповідь для подробиць


Дякую. Я постійно отримую ValueError: неможливо перетворити NA на ціле число.
Іван

1
Тому я посилався на цю відповідь . Це повинно допомогти вирішити цю проблему.
Праймер


11

Ви також можете використовувати countplotз seaborn. Цей пакет спирається на pandasстворення високорівневого інтерфейсу побудови графіків. Це дає вам гарний стиль та правильні мітки осей безкоштовно.

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

введіть тут опис зображення

Він також підтримує забарвлення брусків у потрібний колір з невеликою хитрістю

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

введіть тут опис зображення


10

Щоб побудувати декілька категоріальних ознак як гістограми на одному і тому ж графіку, я б запропонував:

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

введіть тут опис зображення


1
Це чудовий ефект Stroop!
Ciprian Tomoiagă
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.