从plot切换到ggplot2绘制双时间序列图的技术求助
用ggplot2在同一图中绘制两个时间序列
刚从base plot切换到ggplot2确实需要一点适应时间,不过你的需求其实很容易实现。下面给你两种常用的方法,你可以根据自己的使用习惯来选择:
方法一:直接添加多条折线
这种方法适合快速实现,不需要调整数据结构,直接在ggplot对象中依次添加两个geom_line()层即可:
# 首先加载ggplot2包 library(ggplot2) # 绘制图形 ggplot(datframe, aes(x = date)) + # 绘制x序列的折线 geom_line(aes(y = x, color = "x")) + # 绘制y序列的折线 geom_line(aes(y = y, color = "y")) + # 设置坐标轴和图例标签 labs( x = "日期", y = "数值", color = "序列名称" ) + # 可选:使用简洁的主题美化图形 theme_minimal()
解释:
- 先在
ggplot()中指定全局的x轴映射为date - 每个
geom_line()分别指定对应的y轴变量,同时通过color参数区分不同序列 labs()用来自定义坐标轴和图例的显示文本,让图形更清晰theme_minimal()是ggplot2自带的简洁主题,你也可以换成其他主题比如theme_bw()
方法二:转换为长格式数据后绘制(推荐)
ggplot2更适配**整洁数据(tidy data)**格式,也就是每一行代表一个观测值。我们可以用tidyr包的pivot_longer()函数把你的宽格式数据转换为长格式,这样代码会更简洁,后续扩展也更方便:
# 加载需要的包 library(tidyr) library(ggplot2) # 将宽格式数据转换为长格式 dat_long <- pivot_longer( data = datframe, cols = c(x, y), # 需要转换的列 names_to = "series", # 存储原列名的新列名 values_to = "value" # 存储原列值的新列名 ) # 绘制图形 ggplot(dat_long, aes(x = date, y = value, color = series)) + geom_line() + labs( x = "日期", y = "数值", color = "序列名称" ) + theme_minimal()
解释:
pivot_longer()把原来的x和y列合并成了两列:series(标记是x还是y序列)和value(对应序列的数值)- 现在只需要一个
geom_line(),通过color = series自动区分不同序列,代码更简洁 - 如果以后需要添加更多时间序列,只需要修改
cols参数,不需要额外添加geom_line()层
额外小技巧
如果你想自定义折线的颜色,可以添加scale_color_manual()来设置:
# 自定义颜色示例 ggplot(dat_long, aes(x = date, y = value, color = series)) + geom_line() + labs(x = "日期", y = "数值", color = "序列名称") + scale_color_manual(values = c("x" = "blue", "y" = "red")) + theme_minimal()
内容的提问来源于stack exchange,提问作者elio rico
相关产品推荐
相关产品推荐

