问题描述
我正在尝试从 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),202101))
df %>%
filter(!is.na(cases)) %>%
ggplot(aes(x=year_week,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 由粗糙的对角线连接的难看的垂直线。
,问题在于您的 year_week
变量是一个数字。但是,当周数停在 52(或 53)时,例如202052
您在下一年的第一周开始前有 48 = 202101 - 202052 - 1
周的间隔。您可以通过使用 year_week
将 as.character
变量转换为字符来防止这种情况发生。或者你可以做一些格式化,例如拆分年份和星期,并在它们之间添加一个连字符、空格等,就像我在代码中所做的那样:
注意:转换为字符时必须使用 group
aes。
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)
df$year_week <- paste(substr(df$year_week,1,4),substr(df$year_week,5,6),sep = "-")
library(ggplot2)
ggplot(df,aes(x=year_week,y=cases,group = 1))+
geom_line()+
theme(axis.text.x = element_text(angle = 45,size=9))