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

如何在ggplot中合并不同日期尺度的两个数据框变量绘图?

问题描述

我拥有两个数据框,需要将三个变量(propIT_econ、propUK_econ、Economic_situation)合并绘制在同一幅图中,但因日期格式不统一,尝试的代码无法实现需求:

  • PSA数据框:date变量为%Y%m%d格式(时间范围1996-10-23至2022-12-14,含缺失日期),已转换为长格式PSAlong,需使用其中的propIT_econ和propUK_econ变量。
  • MIP_nat数据框:date变量为%Y.季度格式(时间范围2004-2022),尝试as.yearqtr(MIP_nat$date)转换时返回NA,需使用其中的Economic_situation变量。

单独绘制PSAlong的变量可正常运行,但合并绘图失败。

解决方案

1. 修复日期格式统一问题

MIP_nat的日期转换失败是因为未指定匹配的格式,原日期为"2004.3"这类年份.季度结构,需明确格式参数:

library(tidyverse)
library(zoo)

# 转换MIP_nat的日期为Date格式(先转yearqtr再转Date,取季度最后一天)
MIP_nat <- MIP_nat %>%
  mutate(
    date = as.yearqtr(date, format = "%Y.%q"),
    date = as.Date(date, frac = 1) # frac=1取季度最后一天,frac=0取第一天,按需选择
  )

2. 绘制合并图(双Y轴适配数值范围)

由于Economic_situation的数值范围(28-37)和另外两个比例变量(0-30)接近,但为了更清晰区分,采用双Y轴方案:

# 筛选PSAlong的目标变量
PSA_target <- PSAlong %>%
  filter(variable %in% c("propIT_econ", "propUK_econ"))

ggplot() +
  # 绘制PSA的两个比例变量(左Y轴)
  geom_step(data = PSA_target,
            aes(x = date, y = value, color = variable),
            linewidth = 0.7, alpha = 0.8) +
  # 绘制MIP的Economic_situation(右Y轴)
  geom_point(data = MIP_nat,
             aes(x = date, y = Economic_situation),
             color = "darkred", size = 3) +
  geom_line(data = MIP_nat,
            aes(x = date, y = Economic_situation),
            color = "darkred", linetype = "dashed") +
  # 配置X轴日期格式
  scale_x_date(
    date_breaks = "2 years",
    date_labels = "%Y",
    limits = as.Date(c("1996-01-01", "2023-01-01"))
  ) +
  # 配置双Y轴
  scale_y_continuous(
    name = "Economic Proportion (%)",
    sec.axis = sec_axis(~ ., name = "Economic Situation Index")
  ) +
  # 自定义颜色和图例
  scale_color_manual(
    values = c("propIT_econ" = "steelblue", "propUK_econ" = "orange"),
    labels = c("Italy Economic Proportion", "UK Economic Proportion")
  ) +
  labs(
    title = "Economic Indicators Trend (1996-2022)",
    x = "Year",
    color = "Proportion Variables"
  ) +
  theme_minimal() +
  theme(legend.position = "bottom")

3. 可选:单Y轴方案(若接受数值范围重叠)

如果不需要双Y轴,直接叠加图层即可,因为日期格式已经统一:

ggplot() +
  geom_step(data = PSA_target, aes(x = date, y = value, color = variable), linewidth = 0.7, alpha = 0.8) +
  geom_point(data = MIP_nat, aes(x = date, y = Economic_situation), color = "darkred", size = 3) +
  geom_line(data = MIP_nat, aes(x = date, y = Economic_situation), color = "darkred", linetype = "dashed") +
  scale_x_date(date_breaks = "2 years", date_labels = "%Y") +
  scale_color_manual(values = c("propIT_econ" = "steelblue", "propUK_econ" = "orange")) +
  labs(title = "Economic Indicators Over Time", x = "Year", y = "Value") +
  theme_minimal()

关键注意点

  • 日期转换时必须指定format = "%Y.%q",匹配MIP_nat的日期字符串结构,否则as.yearqtr无法识别。
  • 双Y轴仅在数值范围差异较大时使用,若数据范围接近,单Y轴更直观。
  • 若需要更精细的日期对齐,可以调整as.Date(date, frac = x)中的frac参数,x取值0-1,对应季度的不同日期。

内容的提问来源于stack exchange,提问作者user14514023

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 22:17:02