如何对条形图Matplotlib进行分组和绘制值

时间:2018-10-05 07:12:58

标签: python pandas matplotlib sample

我正在尝试将所有group values分为monthsplot作为bar chart。以下是到目前为止我尝试过的事情:

import pandas as pd

d1 = ({
    'Date' : ['1/7/18','1/7/18','1/8/18','1/8/18','1/9/18'],     
    'Value' : ['Foo','Bar','Foo','Bar','Foo'],           
    })

df1 = pd.DataFrame(data = d1)

df1['Date'] = pd.to_datetime(df1['Date'])
df1.set_index('Date', inplace = True)
df1.resample('1M').count()['Value'].plot(kind = 'bar')

但这只会生成one barcount的{​​{1}}。我希望预期的输出将是5单独的3bars的{​​{1}}代表count2代表July2代表August

3 个答案:

答案 0 :(得分:3)

问题在于转换为日期时间,需要设置格式或dayfirst=True,因为DD/MM/YY

df1['Date'] = pd.to_datetime(df1['Date'], format='%d/%m/%y')

或者:

df1['Date'] = pd.to_datetime(df1['Date'], dayfirst=True)

如果需要按月份名称绘图,请使用:

df1['Date'] = pd.to_datetime(df1['Date'], format='%d/%m/%y').dt.month_name()
#alternative
#df1['Date'] = pd.to_datetime(df1['Date'], format='%d/%m/%y').dt.strftime('%B')
df1.groupby('Date')['Value'].count().plot(kind = 'bar')

g

如果需要正确订购月份:

months = ['January','February','March','April','May','June','July','August',
          'September','October','November','December']

df1['Date'] = pd.Categorical(df1['Date'], categories=months, ordered=True)
df1.groupby('Date')['Value'].count().plot(kind = 'bar')

g1

如果要过滤掉0值:

df1.groupby('Date')['Value'].count().pipe(lambda x: x[x != 0]).plot(kind = 'bar')

g2

感谢@ason​​gtoruin提供另一个想法:

df1['Date'] = pd.to_datetime(df1['Date'], format='%d/%m/%y') 
#if necessary sorting datetimes
#df1 = df1.sort_values('Date')

df1['month_name'] = df1['Date'].dt.month_name()

df1.groupby('Date').agg({'Value': 'count', 'month_name': 'first'})
                   .plot(x='month_name', y='Value', kind='bar')

答案 1 :(得分:0)

您的代码可以正常工作,但是您混淆了日/月格式

您需要做的就是改变

'Date' : ['1/7/18','1/7/18','1/8/18','1/8/18','1/9/18'], 

收件人

'Date' : ['7/1/18','7/1/18','8/1/18','8/1/18','9/1/18'],

答案 2 :(得分:0)

另一种解决方案是使用数据透视表按日期分组。

extension Dictionary where Key == String, Value == Any {
    var localized: String {
        print("self: \(self)")
        return "hello"
    }
}