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

如何在ggplot预测图的X轴区域用堆叠点展示观测数据量?

解决方案

下面提供几个在ggplot主图X轴附近展示观测站点数的可行方案,无需合并两个数据框,且避免遮挡主图内容:

方案1:在主图下方区域绘制堆叠点(解决geom_dotplot的y轴问题)

手动为主图预留底部空间,将堆叠点固定在主图y轴下限以下的区域,每个点代表一个观测站点,堆叠数量对应Week列的数值:

library(ggplot2)

# 假设主图数据为pred_df,包含diff_fit、lower、upper、year、WeekFac
ggplot() +
  # 绘制主图的预测线和置信区间
  geom_line(data = pred_df, aes(x = WeekFac, y = diff_fit, color = year), group = 1) +
  geom_ribbon(data = pred_df, aes(x = WeekFac, ymin = lower, ymax = upper, fill = year), alpha = 0.2) +
  # 绘制堆叠点:手动设置y轴位置,用dotplot展示观测站点数
  geom_dotplot(data = WeekFreq, 
               aes(x = WeekFac, y = -5, fill = factor(Week)),  # y设为主图下限以下的固定值
               binaxis = "y", stackdir = "center", dotsize = 0.8, alpha = 0.6) +
  # 调整y轴范围,留出底部空间
  ylim(-7, max(pred_df$upper) + 1) +
  # 自定义主题,隐藏底部点的y轴刻度(可选)
  theme(axis.text.y = element_text(),
        axis.title.y = element_text()) +
  labs(x = "周数", y = "预测差值(diff_fit)", fill = "观测站点数")

说明:这里的y = -5可以根据主图的实际y轴范围调整,确保点在主图下方不遮挡内容;fill = factor(Week)让不同观测数的堆叠点有明显颜色区分,解决原方案颜色区分度低的问题。

方案2:在X轴下方绘制微型条形图

用条形图直接展示每周的观测站点数,将条形图固定在主图底部,高度对应Week数值:

ggplot() +
  # 主图内容:预测线+置信区间
  geom_line(data = pred_df, aes(x = WeekFac, y = diff_fit, color = year)) +
  geom_ribbon(data = pred_df, aes(x = WeekFac, ymin = lower, ymax = upper, fill = year), alpha = 0.2) +
  # 底部微型条形图
  geom_col(data = WeekFreq, 
           aes(x = WeekFac, y = -Week/2),  # 除以2缩小条形高度,避免占用过多空间
           fill = "#2c3e50", alpha = 0.7) +
  # 调整y轴范围,确保条形图完全显示
  ylim(-max(WeekFreq$Week)/2 - 1, max(pred_df$upper) + 1) +
  labs(x = "周数", y = "预测差值(diff_fit)") +
  annotate("text", x = 1, y = -max(WeekFreq$Week)/2 - 0.5, label = "观测站点数", hjust = 0)

说明:y = -Week/2将条形图反向绘制在X轴下方,通过调整除数控制条形高度;可以给条形图添加颜色映射(fill = factor(Week))进一步区分不同观测数。

方案3:直接在X轴上方标注观测站点数

如果不需要可视化堆叠效果,直接用文本标注每周的观测数,简洁直观:

ggplot() +
  geom_line(data = pred_df, aes(x = WeekFac, y = diff_fit, color = year)) +
  geom_ribbon(data = pred_df, aes(x = WeekFac, ymin = lower, ymax = upper, fill = year), alpha = 0.2) +
  # 标注观测站点数在X轴上方
  geom_text(data = WeekFreq, 
            aes(x = WeekFac, y = min(pred_df$diff_fit) - 0.5, label = Week),
            size = 3, color = "darkred") +
  # 调整y轴范围,留出标注空间
  ylim(min(pred_df$diff_fit) - 1.5, max(pred_df$upper) + 1) +
  labs(x = "周数", y = "预测差值(diff_fit)")

说明:y = min(pred_df$diff_fit) - 0.5将文本放在主图最低数据点下方,避免遮挡;可以根据需要调整文本位置和样式。


内容的提问来源于stack exchange,提问作者Gabrielle Ripa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 12:12:41