如何在Base R的时间序列多图中添加垂直虚线?
Base R 解决方法
在Base R中绘制多子图后,直接调用abline()只会对当前激活的子图生效,所以要让垂直线出现在所有5个子图里,有两种简便方式:
方式1:绘制每个子图后立即添加垂直线
先设置多子图布局,然后循环绘制每个序列,每画完一个就加垂直线:
# 设置5行1列的子图布局 par(mfrow = c(5, 1)) # 定义垂直线位置 v_pos <- c(27, 87, 167, 220, 280, 329) # 循环绘制每个子图并添加垂直线 for (i in 1:ncol(data1)) { plot(data1[, i], type = 'l', lwd = 1.5, family = "A", ylab = "", xlab = "", main = "") abline(v = v_pos, lty = 2) }
方式2:先完成所有子图绘制,再逐个激活子图添加垂直线
如果已经画好了所有子图,可以通过par(mfg)切换到对应子图再添加线条:
# 假设已经完成5个子图的绘制 v_pos <- c(27, 87, 167, 220, 280, 329) # 遍历每个子图添加垂直线 for (i in 1:5) { par(mfg = c(i, 1)) # 激活第i行第1列的子图 abline(v = v_pos, lty = 2) }
ggplot2 实现方案
用ggplot2处理这类多子图时间序列更高效,核心是用分面功能,无需手动管理子图布局:
步骤1:转换数据格式(宽→长)
ggplot2更适配长格式数据,先把宽格式的data1转换为长格式:
library(ggplot2) library(tidyr) # 转换为长格式,假设data1的每列对应一个时间序列 data_long <- pivot_longer(data1, cols = everything(), names_to = "series_name", values_to = "value") # 添加时间轴变量(假设行号即为x轴数值) data_long$time <- 1:nrow(data_long)
步骤2:绘制分面时间序列图并添加垂直线
ggplot(data_long, aes(x = time, y = value)) + geom_line(linewidth = 1.5, family = "A") + # 对应Base R中的lwd=1.5 facet_wrap(~series_name, ncol = 1, scales = "free_y") + # 垂直排列子图,y轴可自由缩放 geom_vline(xintercept = c(27, 87, 167, 220, 280, 329), linetype = "dashed") + labs(x = "", y = "", title = "") + # 清空轴标签和标题 theme(text = element_text(family = "A")) # 应用指定字体
facet_wrap会自动生成对应数量的子图,默认所有子图共享x轴geom_vline会自动在所有分面子图中添加垂直线,无需额外循环- 如果需要固定所有子图的y轴范围,将
scales = "free_y"改为scales = "fixed"
内容的提问来源于stack exchange,提问作者confusedindividual
相关产品推荐
相关产品推荐

