使用pandas和matplotlib绘制分类数据

时间:2015-06-24 14:37:16

标签: python pandas

我有一个包含分类数据的数据框:

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

7 个答案:

答案 0 :(得分:110)

您只需在系列中使用value_counts

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

enter image description here

答案 1 :(得分:18)

像这样:

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

答案 2 :(得分:15)

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

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

enter image description here

但要注意0大小的单元格 - 它们会导致标签出现问题。

有关详细信息,请参阅this answer

答案 3 :(得分:5)

您还可以使用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')

enter image description here

它还支持用正确的颜色着色条纹

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

enter image description here

答案 4 :(得分:1)

要在同一图上绘制多个分类特征作为条形图,我建议:

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

enter image description here

答案 5 :(得分:0)

您可以简单地使用 value_counts 并将 sort 选项设置为 False。这将保留类别的顺序

df['colour'].value_counts(sort=False).plot.bar(rot=0)

link to image

答案 6 :(得分:0)

使用情节

import plotly.express as px
px.bar(df["colour"].value_counts())