绘制一个以月为x轴且每日数据集的海洋箱线图

时间:2018-08-30 12:26:12

标签: python seaborn boxplot

我有一个像这样的数据集:

>>> print(ds.head())

         date     sum
  0  2013-08-31  19.000
  1  2013-09-01  37.000
  2  2013-09-02  10.750
  3  2013-09-03  21.500
  4  2013-09-04  44.125

>>> print(ds.tail())


            date      sum
    1742  2018-08-24  129.875
    1743  2018-08-25  196.375
    1744  2018-08-26  247.000
    1745  2018-08-27  104.125
    1746  2018-08-28  149.250

数据集包含约1700行,其中包含每日数据。 我想绘制一个箱线图,所以请查看每月值。 像这样 monthly boxplot

我需要使用JAN / FEB / MAR等x轴上的月份。

如果有每日数据集,我找不到任何可行的解决方案可以实现这一目标。我认为我必须先进行数据准备并每月对值进行分组? 还是我可以用一种简单而又简短的方式对此进行编程?

3 个答案:

答案 0 :(得分:1)

假设您的DataFrame df包含两列“ date”和“ sum”,我们需要在“ date”字段上对它进行排序,以使行以正确的顺序排列,否则我们可以看到月份顺序错误。然后,我们需要创建一个支持列,其中包含每个日期的月份名称。就是这样,我们已经准备好进行剧情准备。

代码在这里:

import pandas as pd
import seaborn as sns

# just an example...
df = pd.DataFrame([["2013-08-31", 19], ["2013-09-01", 37], ["2013-09-02", 10.75]], columns=["date", "sum"])

# sort the rows by date
df.sort_values(by="date", inplace=True)

# create a support series with the name of the month of each row
month_names = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
months = df["date"].apply(lambda date: month_names[int(date.split("-")[1])-1])

# plot it
sns.boxplot(months, df["sum"])

希望对您有帮助。

答案 1 :(得分:1)

您可以从日期时间开始使用功能strftime

这里是一个例子:

from datetime import date
import random
import pandas as pd
from seaborn import boxplot

dates = [date.today()]*10
dataSum = [random.randint(1,100) for x in range(10)] 

d = {'date': dates, 'sum':dataSum}
df = pd.DataFrame(data = d)

dateData =  [x.strftime('%B') for x in df['date']]
boxplot(dateData, df['sum'])

Resulting Plot

答案 2 :(得分:1)

您可以使用dt.strftime('%b')元素并按如下所示创建月份列:

df=pd.DataFrame(np.random.randint(50,1000,365).reshape(-1,1),
                index=pd.date_range('2018-01-01','2018-12-31',freq='D'),
                columns=['sum'])
df.reset_index(inplace=True)
df.columns = ['Date','sum']
df.head()

          Date  sum
0   2018-01-01  984
1   2018-01-02  582
2   2018-01-03  967
3   2018-01-04  503
4   2018-01-05  330

df['month'] = df['Date'].dt.strftime('%b')

使用seaborn.boxplot并传递x='month'y='sum'data=df作为参数。您将获得所需的箱线图。

fig, ax = plt.subplots()
fig.set_size_inches((12,4))
sns.boxplot(x='month',y='sum',data=df,ax=ax)
plt.show()

Actual Plot look like this绘图颜色和其他参数未设置为OP的显示绘图。