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

Answers:


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']]
Alexander

能否请您告诉我如何调整此图。我的意思是说,如果我想为每个班级更改颜色,或者要为其添加图例。
Ibtihaj Tahir

24

您可能会mosaic从statsmodels中找到有用的图。这也可以统计突出显示方差。

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

在此处输入图片说明

但是请注意大小为0的单元格-它们会引起标签问题。

查看此答案以获取详细信息


谢谢。我不断收到ValueError:无法将NA转换为整数。
伊万

1
这就是为什么我引用了这个答案。它应该有助于解决这个问题。
入门

19

像这样 :

df.groupby('colour').size().plot(kind='bar')

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
这是很大的Stroop效果!
CiprianTomoiagă
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.