You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:42:22