R:删除图表中没有数据(NA)的范围x轴
R: Remove range x axis without data (NA) in a graph
我正在尝试从 ggplot 中删除一系列 x 轴。我的数据 x 代表年和周:
202045:2020 年第 45 周
202053:2020年最后一周(任何一年都有52-53周,没有更多...)
summary(df$year_week)
Min. 1st Qu. Median Mean 3rd Qu. Max.
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 的粗糙对角线连接难看的垂直线。
问题是您的 year_week
变量是一个数字。然而,由于周停止在 52(或 53),例如202052
在明年的第一周开始之前,您有 48 = 202101 - 202052 - 1
周的间隔。您可以通过使用 as.character
将 year_week
变量转换为字符来防止这种情况发生。或者你可以做一些格式化,例如拆分年和周并添加一个连字符,space,...就像我在代码中所做的那样:
注意:转换为字符时,您必须使用 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,
hjust = 0.85, size=9))
我正在尝试从 ggplot 中删除一系列 x 轴。我的数据 x 代表年和周:
202045:2020 年第 45 周
202053:2020年最后一周(任何一年都有52-53周,没有更多...)
summary(df$year_week)
Min. 1st Qu. Median Mean 3rd Qu. Max. 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 的粗糙对角线连接难看的垂直线。
问题是您的 year_week
变量是一个数字。然而,由于周停止在 52(或 53),例如202052
在明年的第一周开始之前,您有 48 = 202101 - 202052 - 1
周的间隔。您可以通过使用 as.character
将 year_week
变量转换为字符来防止这种情况发生。或者你可以做一些格式化,例如拆分年和周并添加一个连字符,space,...就像我在代码中所做的那样:
注意:转换为字符时,您必须使用 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,
hjust = 0.85, size=9))