r - 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))
我试图用 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 周)
解决方案
您可以制作两个单独的图,一个用于 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 由粗糙的对角线连接。