R中绘制不同日期时间序列:ggplot未生成重叠曲线问题
解决双日期序列重叠绘图问题
问题根源
- 原始日期列是字符类型,ggplot将其当作离散类别处理,无法形成连续时间轴
- RR和FSScm1的有效观测分布在不同日期,NA值导致线条断裂,无法呈现连续重叠效果
- 数据仅包含少数日期,未覆盖1997-2007的完整时间范围
解决方案代码
library(ggplot2) library(dplyr) library(tidyr) # 原始数据集 merged_suprises <- data.frame( date = c("1997-10-01", "1997-10-09", "1997-11-06","1997-11-12","1997-12-04","1998-01-01"), RR = c(0,NA,NA,NA,NA,0.22), FSScm1 = c(NA, 0.030, 0.15,-0.04, -0.03,NA), SON3c1 = c(NA,NA,NA,NA,NA,NA) ) # 数据预处理 processed_data <- merged_suprises %>% # 将字符日期转为Date类型 mutate(date = as.Date(date)) %>% # 生成1997-2007年的月度完整时间序列(按每月第一天) right_join(tibble(date = seq.Date(as.Date("1997-01-01"), as.Date("2007-12-31"), by = "month")), by = "date") %>% # 移除无用的SON3c1列,转为长格式 select(-SON3c1) %>% pivot_longer(cols = c(RR, FSScm1), names_to = "series", values_to = "value") %>% # 按序列分组做线性插值,补全缺失值以形成连续线条 group_by(series) %>% mutate(value = approx(date, value, date, rule = 2)$y) %>% ungroup() # 重新计算双Y轴缩放因子 scale_factor <- max(processed_data$value[processed_data$series == "RR"], na.rm = TRUE) / max(processed_data$value[processed_data$series == "FSScm1"], na.rm = TRUE) # 绘制重叠时间序列 ggplot(processed_data, aes(x = date, y = value, color = series)) + geom_line(linewidth = 1) + scale_y_continuous( name = "Romer Romer Shock (blue)", sec.axis = sec_axis(~ . / scale_factor, name = "HFI Shock (red)") ) + scale_color_manual(values = c("RR" = "blue", "FSScm1" = "red")) + theme_minimal() + labs(x = "Date", title = "Monetary Policy Shock Series") + theme( axis.title.y.left = element_text(color = "blue"), axis.title.y.right = element_text(color = "red"), legend.position = "top", plot.title = element_text(hjust = 0.5) )
关键调整说明
- 日期类型转换:将字符型日期转为
Date,让ggplot识别为连续时间轴,而非离散类别 - 时间范围扩展:生成1997-2007年完整月度日期序列,确保两组数据在同一时间轴上对齐
- 缺失值插值:用
approx做线性插值补全NA值,让线条连续,实现预期的重叠效果;若不需要插值,可替换为geom_point展示所有观测点 - 长格式重构:将宽格式数据转为长格式,简化绘图代码逻辑
内容的提问来源于stack exchange,提问作者oatssosimple
相关产品推荐
相关产品推荐

