如何在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
相关产品推荐
相关产品推荐

