Matplotlib 绘制随时间变化的分类数据计数

Matplotlib 绘制随时间变化的分类数据计数,matplotlib,pandas,Matplotlib,Pandas,我有一个数据框(df),其中有一列包含分类数据(ETH),有一个DateTimeIndex,我想绘制一段时间内的分类计数(它们按天索引,理想情况下我想按年绘制) 然而,groupby和pivot的组合并没有给我任何我想要的东西,尽管我知道这应该相当简单。我似乎找不到一个标准的方法来实现这一点-帮助?下面的代码将首先按类别“ETH”分组,然后在每个组上迭代 然后,对于每个组,它使用lambda函数按DataTimeIndex年进行分组,并返回该年的行数。然后绘制这些计数 在绘制年份时,它将其绘制为

我有一个数据框(
df
),其中有一列包含分类数据(
ETH
),有一个DateTimeIndex,我想绘制一段时间内的分类计数(它们按天索引,理想情况下我想按年绘制)


然而,groupby和pivot的组合并没有给我任何我想要的东西,尽管我知道这应该相当简单。我似乎找不到一个标准的方法来实现这一点-帮助?

下面的代码将首先按类别“ETH”分组,然后在每个组上迭代

然后,对于每个组,它使用lambda函数按DataTimeIndex年进行分组,并返回该年的行数。然后绘制这些计数

在绘制年份时,它将其绘制为一个数字(而不是日期),这就是为什么x轴看起来有点奇怪,您可能可以将其转换回日期(例如每年的1月1日),使其更漂亮。我已经使用
plt.xlim
plt.ylim
稍微调整了限制,以使其更易于查看

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame({
    'County': {
        0: 'Bexar',
        3: 'Nueces',
        4: 'Kerr',
        9: 'Harris',
        13: 'Hidalgo'},
    'Date': {
        0: '2012-10-28 00:00:00',
        3: '2012-04-16 00:00:00',
        4: '2013-09-04 00:00:00',
        9: '2013-01-22 00:00:00',
        13: '2013-09-26 00:00:00'},
    'ETH': {
        0: 'Red',
        3: 'Green',
        4: 'Red',
        9: 'Green',
        13: 'Red'}
})
df['Date'] = pd.to_datetime(df['Date'], dayfirst=True, infer_datetime_format = True)
df['ETH'] = df['ETH'].astype('category')
df = df.set_index('Date')

grouped = df.groupby('ETH')

for key, group in grouped:
    data = group.groupby(lambda x: x.year).count()
    data['ETH'].plot(label=key)

plt.xlim(2011, 2014)
plt.ylim(0,3)

plt.legend()

plt.show()


是的,我意识到颜色与ETH变量不匹配,因此“绿色”以蓝色绘制,“红色”以绿色绘制:p

正是我想要的!
import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame({
    'County': {
        0: 'Bexar',
        3: 'Nueces',
        4: 'Kerr',
        9: 'Harris',
        13: 'Hidalgo'},
    'Date': {
        0: '2012-10-28 00:00:00',
        3: '2012-04-16 00:00:00',
        4: '2013-09-04 00:00:00',
        9: '2013-01-22 00:00:00',
        13: '2013-09-26 00:00:00'},
    'ETH': {
        0: 'Red',
        3: 'Green',
        4: 'Red',
        9: 'Green',
        13: 'Red'}
})
df['Date'] = pd.to_datetime(df['Date'], dayfirst=True, infer_datetime_format = True)
df['ETH'] = df['ETH'].astype('category')
df = df.set_index('Date')

grouped = df.groupby('ETH')

for key, group in grouped:
    data = group.groupby(lambda x: x.year).count()
    data['ETH'].plot(label=key)

plt.xlim(2011, 2014)
plt.ylim(0,3)

plt.legend()

plt.show()