scale_x_date报错:如何为新冠前后手术频率回归分析的Cook距离图X轴设置时间框架?
解决Cook距离图X轴时间线的错误问题
你遇到的错误根源很明确:在geom_col里重新指定的x映射(seq_along(.cooksd)这类数值)覆盖了主aes中的日期型x=cons_week_dt,导致ggplot的x轴同时存在数值和日期两种类型,而scale_x_date只能处理纯日期类型的数据。
下面是修正后的完整代码,我会一步步解释改动点:
# 第一步:先正确生成每个观测对应的日期,确保cons_week和日期对应准确 mod <- fortify(lm(n ~ cons_week * corona, data = lin.model)) %>% mutate(cons_week_dt = as.Date("2017-01-02") + cons_week * 7) # 第二步:绘制Cook距离图,统一使用日期作为x轴,不再手动指定x的数值映射 mod %>% ggplot(aes(x = cons_week_dt, y = .cooksd)) + # 直接过滤分组,不用手动调整x位置,颜色直接指定 geom_col(data = filter(mod, corona == "Normal"), color = "#6DBCC3", fill = alpha("#6DBCC3", .2)) + geom_col(data = filter(mod, corona == "C19"), color = "#8B3A62", fill = alpha("#8B3A62", .2)) + # Cook距离阈值线保持不变 geom_hline(yintercept = 4/nrow(lin.model), col = "black", lty = 2) + # 把竖线的xintercept改成对应的日期(原代码的167周对应的日期) geom_vline(xintercept = as.Date("2017-01-02") + 167*7, color = "red", lty = 2) + scale_y_continuous(name = "Cook's Distance") + # 现在x轴是纯日期类型,scale_x_date可以正常工作了 scale_x_date(name = "", date_breaks = "3 months", date_labels = "%B-%Y", expand = c(0.01, 0)) + # 可选:优化x轴标签可读性 theme(axis.text.x = element_text(angle = 45, hjust = 1))
关键改动说明:
- 移除geom_col中的x映射:原来手动指定
seq_along(.cooksd)是多余的,因为我们已经通过cons_week_dt把每个观测对应到了正确的日期位置,直接用主aes的x轴即可。 - 修正竖线的xintercept:原代码用
167是周数,但现在x轴是日期,所以需要把周数转换成对应的日期,确保竖线准确分隔疫情前后的时间段。 - 统一日期生成逻辑:在
mod中提前生成日期列,避免在ggplot中重复计算,保证数据一致性。
如果想让代码更简洁,还可以用颜色映射来替代两次geom_col调用:
mod %>% ggplot(aes(x = cons_week_dt, y = .cooksd, fill = corona, color = corona)) + geom_col(alpha = 0.2) + geom_hline(yintercept = 4/nrow(lin.model), col = "black", lty = 2) + geom_vline(xintercept = as.Date("2017-01-02") + 167*7, color = "red", lty = 2) + scale_y_continuous(name = "Cook's Distance") + scale_x_date(name = "", date_breaks = "3 months", date_labels = "%B-%Y", expand = c(0.01, 0)) + scale_fill_manual(values = c("Normal" = "#6DBCC3", "C19" = "#8B3A62")) + scale_color_manual(values = c("Normal" = "#6DBCC3", "C19" = "#8B3A62")) + theme(axis.text.x = element_text(angle = 45, hjust = 1))
这样代码更简洁,同时也能达到你想要的分组颜色效果。
内容的提问来源于stack exchange,提问作者cmirian
相关产品推荐
相关产品推荐

