如何用R的ggplot绘制多变量累积百分比变化时间序列对比图
问题需求
- 在年份维度下对比
kl(资本劳动比)与rtfpna(全要素生产率)、kl与ly(劳动生产率)的关系 - 图表Y轴设置为累积百分比变化,参考指定双变量对比样式
- 现有代码仅能展示原始变量水平值,无法实现目标效果
- 数据集包含
year、rtfpna、kl、ly四个变量,为1950-2019年时间序列数据
解决方案
步骤1:数据预处理(计算累积百分比变化)
首先将原始变量转换为以1950年为基准的累积百分比变化,公式为:((当前年份值 / 1950年基准值) - 1) * 100,以此直观展示各变量随时间的相对变化幅度。
步骤2:修正后的完整代码
# 加载所需包 library(dplyr) library(reshape2) library(ggplot2) # 计算各变量的累积百分比变化(以1950年为基准) brazil_cum <- brazil %>% mutate( rtfpna_cum = ((rtfpna / rtfpna[year == 1950]) - 1) * 100, ly_cum = ((ly / ly[year == 1950]) - 1) * 100, kl_cum = ((kl / kl[year == 1950]) - 1) * 100 ) %>% select(year, rtfpna_cum, ly_cum, kl_cum) %>% # 转换为长格式适配ggplot melt(id.vars = "year", variable.name = "indicator", value.name = "cumulative_pct") # 绘制对比图表(双Y轴区分资本劳动比与其他变量) ggplot(brazil_cum, aes(x = year)) + # 绘制全要素生产率、劳动生产率曲线 geom_line(aes(y = cumulative_pct, color = indicator), linewidth = 1) + # 单独绘制资本劳动比曲线(深色突出) geom_line(data = subset(brazil_cum, indicator == "kl_cum"), aes(y = cumulative_pct), color = "#2c3e50", linewidth = 1.2) + # 设置坐标轴标签 xlab("年份") + ylab("全要素生产率/劳动生产率 累积百分比变化(%)") + # 配置右Y轴(对应资本劳动比) scale_y_continuous( sec.axis = sec_axis(~ ., name = "资本劳动比 累积百分比变化(%)") ) + # 自定义颜色与图例标签 scale_color_manual( values = c("rtfpna_cum" = "#3498db", "ly_cum" = "#e74c3c"), labels = c("全要素生产率(rtfpna)", "劳动生产率(ly)") ) + # 优化主题样式 theme_minimal() + theme( legend.title = element_blank(), axis.title.y.right = element_text(color = "#2c3e50"), legend.position = "top" )
代码说明
- 累积变化计算:直接通过
mutate基于1950年基准值计算,操作简洁高效 - 长格式转换:用
melt将宽格式数据转为长格式,方便ggplot按变量区分颜色 - 双Y轴设置:通过
sec_axis添加右Y轴,匹配参考图表的双变量对比逻辑 - 样式优化:用颜色、线宽区分变量,提升图表可读性与美观度
内容的提问来源于stack exchange,提问作者emily y
相关产品推荐
相关产品推荐

