如何在同一张图中完整展示不同时间区间的降雨量与计数数据
问题根源
你遇到的核心问题是:ggplot 默认会自动将 x 轴范围设置为所有图层数据日期的交集(2018年5月-2019年3月),导致无计数数据的2018年1-4月被挤出了视图范围,并非柱状图没绘制,只是没显示在当前坐标轴内。
两种解决方案
方案1:手动强制设置x轴完整范围
不需要合并数据,直接在绘图时指定x轴覆盖你需要的全时段,让早于2018年5月的降雨量数据显示出来:
library(ggplot2) library(lubridate) ggplot() + # 绘制降雨量柱状图 geom_col(data = rain_df, aes(x = d, y = mean_tp_rf), fill = "#4682B4", alpha = 0.7) + # 绘制计数数据(这里假设用折线,你可以根据需求换成geom_point/geom_col) geom_line(data = count_df, aes(x = date, y = mean), color = "#CD5C5C", size = 1) + # 强制x轴范围覆盖2018-01到2019-04 scale_x_date( limits = c(ymd("2018-01-01"), ymd("2019-04-30")), date_labels = "%Y-%m", # 刻度显示格式:年-月 date_breaks = "1 month" # 每月一个刻度 ) + # 优化x轴标签显示,避免重叠 theme(axis.text.x = element_text(angle = 45, hjust = 1)) + labs(x = "日期", y = "降雨量", title = "降雨量与计数数据趋势")
方案2:合并数据统一日期列
把两个数据集按日期合并,缺失的计数数据填充为NA,这样ggplot能识别全时段日期,自然会显示所有数据:
library(ggplot2) library(dplyr) library(lubridate) # 合并两个数据集,统一日期列 combined_df <- full_join( # 给降雨量数据重命名日期列,和计数数据对齐 rain_df %>% rename(date = d) %>% select(date, mean_tp_rf), count_df, by = "date" ) ggplot(combined_df, aes(x = date)) + geom_col(aes(y = mean_tp_rf), fill = "#4682B4", alpha = 0.7) + # 计数数据为NA的月份会自动跳过,不影响绘制 geom_line(aes(y = mean), color = "#CD5C5C", size = 1) + scale_x_date(date_labels = "%Y-%m", date_breaks = "1 month") + theme(axis.text.x = element_text(angle = 45, hjust = 1)) + labs(x = "日期", y = "降雨量", title = "降雨量与计数数据趋势")
额外提示
如果两类数据量级差异大(比如降雨量是几十,计数是几千),可以添加双坐标轴让数据更清晰,只需在scale_y_continuous里设置次要坐标轴:
scale_y_continuous( name = "降雨量", # 根据实际数据比例调整转换系数,比如计数是降雨量的100倍就用~./100 sec.axis = sec_axis(~ ., name = "计数") )
内容的提问来源于stack exchange,提问作者steph
相关产品推荐
相关产品推荐

