首页 > 解决方案 > R:删除图表中没有数据(NA)的范围x轴

问题描述

我正在尝试从 ggplot 中删除一系列 x 轴。我的数据 x 代表年和周:

202045:2020 年第 45 周

202053:2020 年的最后一周(任何一年都有 52-53 周,没有更多...)

 summary(df$year_week)

分钟。第一曲。中位数平均第三曲。最大限度。202045 202047 202050 202054 202052 202101

可悲的是,我的数据从 2020 年的上周“跳跃”到 2021 年的第一周,并以“幽灵”周显示 x 轴,例如:

year_week=rep(c(202045,202046,202047,202048,202049,202050,202051,202052,202053,202101),times=1)
cases=rnorm(200, 44, 33)
df=data.frame(year_week, cases)

ggplot(df, aes(x=year_week, y=cases))+
geom_line()+
theme(axis.text.x = element_text(angle = 45,  
    hjust = 0.85, size=9))+
scale_x_continuous(limits=c(202045, 202101))

图1

我试图用 NA 删除,但结果是一样的

df$year_week[df$year_week>202053 & df$year_week<202101]= NA
df$cases[df$year_week>202053 & df$year_week<202101]= NA

ggplot(na.omit(df), aes(x=year_week, y=cases))+
geom_line()+
theme(axis.text.x = element_text(angle = 45,  
    hjust = 0.85, size=9))+
scale_x_continuous(limits=c(202045, 202101))

df %>%
filter(!is.na(cases)) %>%
ggplot(aes(x=year_week, y=cases))+
geom_line()+
theme(axis.text.x = element_text(angle = 45,  
    hjust = 0.85, size=9))+
scale_x_continuous(limits=c(202045, 202101))

我的预期图表是:(任何一年都不存在第 60 周或第 80 周)

预期图表

标签: rggplot2time-seriesx-axis

解决方案


您可以制作两个单独的图,一个用于 2020 年之前,另一个从 2021 年开始,并使用刻面将它们以较小的边距彼此相邻。我认为这可以实现您的目标,而不会因 x 轴标签中的任意跳跃而使您的观众感到困惑。

也许是这样的:

df %>% 
  mutate(
    period = case_when(
      year_week < 202101 ~ "Before 2021",
      year_week >= 202101 ~ "After 2021"
    ),
    period = factor(
      period, 
      levels = c("Before 2021", "After 2021"), 
      ordered = T
    )
  ) %>% 
  ggplot() +
  geom_line(
    aes(
      year_week,
      cases
    )
  ) +
  facet_wrap(
    ~period,
    ncol = 2, 
    scales = "free_x"
  )+
  theme(axis.text.x = element_text(angle = 45,  
                                   hjust = 0.85, size=9))

与您的问题没有直接关系的另一个问题是,您正在为 x 轴值上的每个值绘制多个 y 值,这会导致难看的垂直线使用 geom_line 由粗糙的对角线连接。


推荐阅读