You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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))

关键改动说明:

  1. 移除geom_col中的x映射:原来手动指定seq_along(.cooksd)是多余的,因为我们已经通过cons_week_dt把每个观测对应到了正确的日期位置,直接用主aes的x轴即可。
  2. 修正竖线的xintercept:原代码用167是周数,但现在x轴是日期,所以需要把周数转换成对应的日期,确保竖线准确分隔疫情前后的时间段。
  3. 统一日期生成逻辑:在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 20:23:10