能否用R语言facet_wrap实现叠加双变量+单变量单独展示的折线图
解决方案:实现指定的分面折线图
完全可以实现你的需求,核心是先将宽格式数据转换为长格式,再通过分组字段控制分面。以下是具体步骤和代码:
步骤说明
- 数据格式转换:将原数据框的
Principal、Interest、Balance列转换为长格式,并新增一个分组字段,把Principal和Interest归为同一组,Balance单独一组。 - 绘图配置:使用
ggplot2绘制折线图,通过facet_wrap按分组字段生成两个子图,同时设置自由y轴(因三组数据数值范围差异大)。
完整代码
# 加载所需包 library(tidyverse) # 导入你的数据 df <- structure(list(Date = 2010:2040, Principal = c(684.87465504954, 975.003026846142, 1050.6950457127, 1132.26323271654, 1220.16377006145, 1314.8882545613, 1416.96644696816, 1526.9692347381, 1645.51182480402, 1773.25718421189, 1910.91974786238, 2059.26941409425, 2219.13585045513, 2391.41313374055, 2577.06475025127, 2777.12898423355, 2992.72472463801, 3225.05772267236, 3475.42733514413, 3745.23379130666, 4035.98602384922, 4349.31010782725, 4686.95835472869, 5050.81911253626, 5442.92732659417, 5865.47592034218, 6320.82805956582, 6811.53036875204, 7340.32717346504, 7910.17584839468, 2071.69357387502), Interest = c(5608.05592192545, 7415.57107578718, 7339.87905692061, 7258.31086991678, 7170.41033257186, 7075.68584807202, 6973.60765566516, 6863.60486789522, 6745.0622778293, 6617.31691842143, 6479.65435477093, 6331.30468853906, 6171.43825217819, 5999.16096889277, 5813.50935238204, 5613.44511839977, 5397.84937799531, 5165.51637996096, 4915.14676748919, 4645.34031132666, 4354.5880787841, 4041.26399480606, 3703.61574790463, 3339.75499009705, 2947.64677603915, 2525.09818229114, 2069.7460430675, 1579.04373388128, 1050.24692916828, 480.398254238642, 25.949951783305), Balance = c(99315.1253449505, 98340.1223181043, 97289.4272723916, 96157.1640396751, 94937.0002696136, 93622.1120150523, 92205.1455680842, 90678.1763333461, 89032.664508542, 87259.4073243302, 85348.4875764678, 83289.2181623735, 81070.0823119184, 78678.6691781778, 76101.6044279266, 73324.475443693, 70331.750719055, 67106.6929963826, 63631.2656612385, 59886.0318699319, 55850.0458460826, 51500.7357382554, 46813.7773835267, 41762.9582709904, 36320.0309443963, 30454.5550240541, 24133.7269644883, 17322.1965957362, 9981.86942227119, 2071.69357387652, 0)), class = "data.frame", row.names = c(NA, -31L)) # 转换为长格式并生成分组字段 long_df <- df %>% pivot_longer(cols = c(Principal, Interest, Balance), names_to = "Variable", values_to = "Value") %>% mutate(Facet_Group = ifelse(Variable %in% c("Principal", "Interest"), "Principal & Interest", "Balance")) # 绘制分面折线图 ggplot(long_df, aes(x = Date, y = Value, color = Variable)) + geom_line(linewidth = 1) + facet_wrap(~Facet_Group, scales = "free_y") + # 自由缩放y轴,适配不同数值范围 labs(title = "Loan Payments and Balance Over Time", x = "Year", y = "Amount", color = "Metric") + theme_minimal() + theme(strip.text = element_text(size = 12, face = "bold"))
代码解释
- 数据转换:
pivot_longer将宽数据转为长数据,方便ggplot统一处理多个变量;Facet_Group字段用于指定分面的分组规则。 - 分面配置:
facet_wrap(~Facet_Group)生成两个子图,scales = "free_y"让每个子图的y轴独立缩放,避免因Balance数值过大导致另两个变量的趋势被压缩。 - 样式优化:通过
theme_minimal和自定义主题元素提升图表可读性。
内容的提问来源于stack exchange,提问作者Seoyoung Park
相关产品推荐
相关产品推荐

