按日期子集箱线图

Subset boxplot by date

我想根据具有 10 天数据类别的时间序列制作箱线图

set.seed(100)
date <- seq.Date(as.Date("2013-01-01"), as.Date("2014-12-31"), "days")
x <- as.integer(abs(rnorm(365))*1000)
df <- data.frame(date, x)

library(ggplot2)    
ggplot(df) +
      geom_boxplot(aes(y=x,
                       x=reorder(format(df$date,'10 days'),df$date),
                       fill=format(df$date,'%Y'), 
                       group=cut(df$date, "10 days"))) +
      xlab('10 Dyas') + guides(fill=guide_legend(title="Year")) +
      theme_bw()

但是我得到了这样的结果

我不知道为什么我在这里得到 NA 并且 x 标签不显示日期轴,如 1 月 1 日至 10 日、1 月 11 日至 20 日等

我的脚本有问题吗?

您可以使用 scale_x_date

library(ggplot2)

ggplot(df) +
  geom_boxplot(aes(y=x,
                   x=date,
                   fill=format(date,'%Y'))) +  
   xlab('Monthly data') + guides(fill=guide_legend(title="Year")) +
   theme_bw() + 
   scale_x_date(breaks = '1 month') + 
   theme(axis.text.x = element_text(angle = 90, hjust = 1))

我选择 1 个月作为休息时间间隔以获得更好的可见性,但如果需要,您可以使用 "10 days"

我只是想帮你解决问题。我认为如果您在 ggplot:

之前生成所需的变量,将很容易解决问题
set.seed(100)
date <- seq.Date(as.Date("2013-01-01"), as.Date("2014-12-31"), "days")
x <- as.integer(abs(rnorm(365))*1000)
df <- data.frame(date, x)
library(tidyverse)

df1<-df %>% 
  mutate(
      x1=reorder(format(date,'10 days'),date),
      fill=format(date,'%Y'), 
      group=cut(date, "10 days")
 )

df1 %>% 
  ggplot(aes(y = x, x= date, fill=fill, group= group))+
  geom_boxplot()

那么如果你查看你的数据df1,你会发现当group == 2013-12-27时,fill有两个值:20132014。这就是为什么除了 20132014 之外还有一个 NA 组。解决方案取决于您希望如何将值分配给该组,或分组的替代方式。一个愚蠢的快速修复是

df1$fill = ifelse(as.character(df1$group) == "2013-12-27", "2013", df1$fill)

您还可以检查由 x = reorder(format(df$date,'10 days'), df$date)(我使用 x1)生成的 x 轴只有一个值:10 days