按日期子集制作箱线图,按月份对x轴进行排序。

4

我有一年跨越两个日历年的数据。我希望按月份对这些数据子集绘制盒形图。

绘图将始终按字母顺序排序(如果使用月份名称)或按数字顺序排序(如果使用月份号码)。 两者都不适合我的目的。

在下面的示例中,我希望x轴上的月份从2013年的六月开始,到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个回答

8
你是否在寻找类似这样的东西:
boxplot(df$x ~ reorder(format(df$date,'%b %y'),df$date), outline = FALSE) 

我使用“reorder”按日期重新排序您的数据。我还格式化日期以跳过日期部分,因为您按月聚合您的箱形图。
编辑:
如果您想跳过年份部分(但为什么?个人认为这有点混淆):
boxplot(df$x ~ reorder(format(df$date,'%B'),df$date), outline = FALSE)

输入图片说明

编辑2: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

我曾遇到类似问题,想将图表按照一月到十二月的顺序排序。这似乎是让人困扰的常见原因,以下是我的解决方案:

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)

0
找到一个答案这里 - 使用一个因子,而不是日期:
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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接