Построение категориальных данных с помощью pandas и 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?
П. Камиллери

3
Да, вы можете явно указать порядок x-меток, напримерdf['colour'].value_counts()[['green', 'yellow', 'blue', 'red']]
Александр

Подскажите, пожалуйста, как мне внести коррективы в этот сюжет. Я имею в виду, если я хочу изменить цвет для каждого класса или добавить к нему легенду.
Ибтихадж Тахир

24

Вы можете найти полезный mosaicсюжет из statsmodels. Это также может дать статистическое выделение отклонений.

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

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

Но будьте осторожны с ячейками 0 размера - они вызовут проблемы с этикетками.

См. Этот ответ для подробностей


Спасибо. Я продолжаю получать ValueError: не могу преобразовать NA в целое число.
Иван

1
Вот почему я сослался на этот ответ . Это должно помочь решить эту проблему.
Primer


11

Вы также можете использовать countplotfrom 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
Это отличный эффект Струпа!
Ciprian Tomoiagă
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.