如何使用ggplot2对齐盒子图的网格和胡须?

时间:2018-04-04 16:10:27

标签: r ggplot2 boxplot week-number

我根据这个答案绘制按周数分组的小时数据:https://stackoverflow.com/a/48196838/5235575

我的例子显示2016年的前两周从2016年1月1日星期一00:00开始,到2016年1月17日星期日23:00结束

如何将主网格和x轴的相应标签与箱形图的胡须对齐?

ggplot(table, aes(x=as.Date(datetime_hour), y=count_hour, group=format(as.Date(datetime_hour),"%W"))) + geom_boxplot() + scale_x_date(date_breaks = "week", date_labels="%W") + labs(x = "week number")

enter image description here

2 个答案:

答案 0 :(得分:0)

IIUC - 只需在aes x 参数中传递计算出的周数

ggplot(table, aes(x = format(as.Date(table$datetime_hour),"%W"), y = count_hour, 
                  group = format(as.Date(table$datetime_hour),"%W"))) + 
  geom_boxplot() + labs(x = "week number")

或者,将其创建为新变量:

table$week_num <- format(as.Date(table$datetime_hour),"%W")

ggplot(table, aes(x = week_num, y = count_hour, group = week_num)) + 
  geom_boxplot() + labs(x = "week number")

使用随机数据进行演示(播种再现性)

set.seed(6776)

table <- data.frame(
  datetime_hour = Sys.Date() - seq(30),
  count_hour = rnorm(30, mean = 100, sd = 50)
)

table$week_num <- format(as.Date(table$datetime_hour),"%W")

ggplot(table, aes(x = week_num, y = count_hour, group = week_num)) + 
  geom_boxplot() + labs(x = "week number")

GGPlot Output

答案 1 :(得分:0)

不是一个完美的解决方案,但我认为问题在于将数据中的中断与图中的中断对齐。我使用了您链接到的SO帖子中的示例数据,并添加了一个变量,我将日期缩短为几周。这给出了一个因子,我将其用作ggplot中的x输入,并使用scale_x_discrete使用函数格式化标签。

library(ggplot2)

# From linked SO post

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

# Cut dates into weeks

df$date_brk <- cut(df$my.date, breaks = "week")

ggplot(df, aes(x = date_brk, y = value)) +
    geom_boxplot() +
    scale_x_discrete(labels = function(x) format(as.Date(x), "%W")) +
    theme(panel.grid.minor.x = element_blank())

reprex package(v0.2.0)创建于2018-04-04。

使用lubridate包可能有更好的方法。