如何在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
相关产品推荐
相关产品推荐

