Python 生成分类数据计数的多个图,以显示多年数据的趋势

Python 生成分类数据计数的多个图,以显示多年数据的趋势,python,matplotlib,seaborn,Python,Matplotlib,Seaborn,我有一个大约14000行和100列的数据帧。我想可视化一列分类数据的频率是如何随时间变化的(第二列是YYYY)。以下是一个简化的数据框: import pandas as pd df = pd.DataFrame({ 'Year': ('1999','1999','1999','2000','2000','2001','2001','2002','2003'), 'Cat': ('A','A','C','B','B','B','C','D','D') }) 使用Pandasgroupby和re

我有一个大约14000行和100列的数据帧。我想可视化一列分类数据的频率是如何随时间变化的(第二列是YYYY)。以下是一个简化的数据框:

import pandas as pd
df = pd.DataFrame({
'Year': ('1999','1999','1999','2000','2000','2001','2001','2002','2003'),
'Cat': ('A','A','C','B','B','B','C','D','D')
})
使用Pandas
groupby
reset\u index
,我将感兴趣的数据放在一个漂亮的表中

df = df.groupby(['Year', 'Cat'])['Cat'].size()
df = df.reset_index(name='count')
对于每一年,我想要一个显示每只猫的频率(计数)的图(即使是0)。由于数据集跨越16年,我希望它是一个4x4的条形图矩阵(上面的测试数据集限制为2x2)


我在matplotlib和seaborn中有基本绘图的经验,但我的python经验有限,我似乎还不能解决这个问题。

我不太确定您想做什么,但我希望这会对您有所帮助

import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
df = pd.DataFrame({
'Year': ('1999','1999','1999','2000','2000','2001','2001','2002','2003'),
'Cat': ('A','A','C','B','B','B','C','D','D')
})

labels = df.Year
Cat = df.Cat


x = np.arange(len(labels))  # the label locations
width = 0.35  # the width of the bars

fig, ax = plt.subplots()
rects1 = ax.bar(x - width/2, Cat, width, label='Cat')

# Add some text for labels, title and custom x-axis tick labels, etc.
ax.set_ylabel('Scoring or I dunno')
ax.set_title('Some Letters')
ax.set_xticks(x)
ax.set_xticklabels(labels)
ax.legend()


def autolabel(rects):
    """Attach a text label above each bar in *rects*, displaying its height."""
    for rect in rects:
        height = rect.get_height()
        ax.annotate('{}'.format(height),
                    xy=(rect.get_x() + rect.get_width() / 2, height),
                    xytext=(0, 3),  # 3 points vertical offset
                    textcoords="offset points",
                    ha='center', va='bottom')


autolabel(rects1)

fig.tight_layout()

plt.show()


您可以使用
reindex
获取零值,然后使用seaborn
FaceGrid
绘图。我使用
value\u counts
首先获取数据帧,但是您可以对当前的数据帧使用
set\u index
,然后使用
reset\u index

df2 = df.groupby('Year')['Cat'].value_counts()
df2.name = 'count'
ix = pd.MultiIndex.from_product([df2.index.levels[0], list('ABCD')], names=['Year', 'Cat'])
df2 = df2.reindex(ix, fill_value=0).reset_index()

g = sns.FacetGrid(df2, col='Year', col_wrap=2)
g.map(plt.bar, 'Cat', 'count')

谢谢您的回答!我试过了,但没能得到和你一样的结果;我相信这与索引有关。在我尝试某些东西时保留这个位置。由于实际的Cat列包含15个不同的单词(我现在意识到我的示例应该反映了这一点),
pd.MultiIndex.from_product([df2.index.levels[0],df2['Cat'].unique()],names=['Year',Cat'])
做到了这一点。我现在只需要垂直排列标签或调整图形大小,以便阅读它们。谢谢你的帮助
g.set\u xticklabels(旋转=90)
谢谢您的时间。busybear的回应完成了我想要的。如果我不清楚,我的任命。