按周分组的ggplot2箱线图

3

这段代码生成一个箱线图:

df <- data.frame(value = rnorm(62), my.date = seq(as.Date("2013-12-01"), as.Date("2014-01-31"), by="1 day"))

library(ggplot2)
ggplot(df, aes(as.Date(my.date), value)) + geom_boxplot() + scale_x_date(minor_breaks = "1 week", labels = date_format("%W\n%b"))

如何绘制一个仅包含12月1日至1月31日之间每周的单个箱线图的图表?在这个单个图中,应该有大约8个箱线图。希望使用ggplot()scale_x_date()来解决。
3个回答

3
这满足了 @luciano 的要求,保留了 scale_x_date 函数的功能。
library('scales')
library(ggplot2)
df <- data.frame(value = rnorm(62), my.date = seq(as.Date("2013-12-01"), as.Date("2014-01-31"), by="1 day"))
ggplot(df, aes(x=as.Date(my.date), y=value, group=format(as.Date(my.date),"%W-%b"))) + geom_boxplot() + scale_x_date(date_breaks = "1 week", date_labels="%Y-%b-%d")

使用scale_x_date的箱形图

另外,如果您不想按周#分组数据 - 这会使您在大多数新年周围拆分数据 - 您可以按周日结束的方式进行分组。 通过以下一些代码调整从星期天结束到星期五结束等,这是可以实现的: ceiling_date(x, "week") + ifelse(weekdays(x) %in% c("Saturday", "Sunday"), 5, -2)

ggplot(df, aes(x=as.Date(my.date), y=value, group=ceiling_date(my.date, "week"))) + geom_boxplot() + scale_x_date(date_breaks = "1 week", date_labels="%Y-%b-%d")

Group by weekending Sundays


2

一种选择是在使用 ggplot 之前转换您的日期。

library(ggplot2)
df <- data.frame(value = rnorm(62), 
my.date = seq(as.Date("2013-12-01"), as.Date("2014-01-31"), by="1 day"))
weeks <- format(df$my.date, "%Y/%W")
weeks <- factor(weeks, levels = unique(weeks))

ggplot(df, aes(weeks, value)) +
    geom_boxplot()

scale_x_date内部难道没有实现这个的方法吗? - luciano
小细节:为了处理多年情况,我可能会让格式化同时带上年份和周数,并将其分配到数据框中作为新列df$weeks <- format(df$my.date, "%Y/%W") - Matt Weller
感谢大家的回复。然而,到目前为止所有的回复都删除了 scale_x_date 的功能,例如 minor_breaks。有没有人有一个解决方案,不必诉诸于使用 reorderscale_x_discretefactor - luciano

2
library(ggplot2)    
ggplot(df, aes(format(as.Date(my.date), "%W\n%b"), value)) + geom_boxplot()  

编辑:

按日期排序:

ggplot(df, aes(reorder(format(as.Date(my.date), "%W\n%b"), 
                       as.Date(my.date)), 
               value)) + 
  geom_boxplot() 

这可以通过以下代码进行修复:df$week <- factor(format(as.Date(df$my.date), "%W\n%b"))ggplot(df, aes(week, value)) + geom_boxplot() + scale_x_discrete(limits=unique(df$week)) - tonytonov
你应该能够轻松地使用 reorder() 函数更改顺序:ggplot(df, aes(reorder(format(as.Date(my.date), "%W\n%b"), as.Date(my.date)), value)) + geom_boxplot() - lukeA

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