按日期的子集箱图,按月x轴排序

时间:2014-09-28 21:01:02

标签: r date boxplot

我有一年的数据跨越两个日历年。我想按月为这些数据子集绘制箱图。

图表将始终按字母顺序排列(如果我使用月份名称)或数字排序(如果我使用月份数字)。都不符合我的目的。

在下面的示例中,我希望x轴上的月份从6月(2013年)开始,到5月(2014年)结束。

date <- seq.Date(as.Date("2013-06-01"), as.Date("2014-05-31"), "days")

set.seed(100)
x <- as.integer(abs(rnorm(365))*1000)

df <- data.frame(date, x)

boxplot(df$x ~ months(df$date), outline = FALSE)

我可能按照我需要的顺序(例如months <- months(seq.Date(as.Date("2013-06-01"), as.Date("2014-05-31"), "month"))

生成月份的向量

有更优雅的方法吗?我错过了什么?

3 个答案:

答案 0 :(得分:4)

你在寻找这样的东西:

boxplot(df$x ~ reorder(format(df$date,'%b %y'),df$date), outline = FALSE) 

我正在使用reorder根据日期重新排序您的数据。我也将日期格式化为跳过日期部分,因为它是按月汇总您的箱图。

enter image description here

编辑:

如果你想跳过年份(但为什么呢?我个人觉得这有点令人困惑):

boxplot(df$x ~ reorder(format(df$date,'%B'),df$date), outline = FALSE)

enter image description here

EDIT2 ggplot2解决方案:

因为您正在营销领域并且正在学习ggplot2 :)

library(ggplot2)

ggplot(df) +
  geom_boxplot(aes(y=x,
                   x=reorder(format(df$date,'%B'),df$date),
                   fill=format(df$date,'%Y'))) +
  xlab('Month') + guides(fill=guide_legend(title="Year")) +
  theme_bw()

enter image description here

答案 1 :(得分:1)

我有一个类似的问题,我想在1月到12月订购情节。这似乎是人们烦恼的常见原因,这是我的解决方案:

date <- seq.Date(as.Date("2013-06-01"), as.Date("2014-05-31"), "days")

set.seed(100)
x <- as.integer(abs(rnorm(365))*1000)

months <- month.name
boxplot(x~as.POSIXlt(date)$mon,names=months, outline = FALSE)

答案 2 :(得分:0)

找到答案here - 使用因素,而不是日期:

set.seed(100)
x <- as.integer(abs(rnorm(365))*1000)

df <- data.frame(date, x)

# create an ordered factor
m <- months(seq.Date(as.Date("2013-06-01"), as.Date("2014-05-31"), "month"))
df$months <- factor(months(df$date), levels = m)

# plot x axis as ordered
boxplot(df$x ~ df$months, outline = FALSE)

plot ordered