R语言基于多列年度汇总数据绘制均值与最大值折线图
可复现实现方案
整个流程基于R的tidyverse生态实现,代码可直接运行复现结果。
1. 环境准备
首次运行需先安装依赖包,后续直接加载即可,依赖包含数据整形、统计计算、绘图全流程所需工具:
# 首次运行请先执行安装命令 # install.packages("tidyverse") library(tidyverse)
2. 加载数据
直接使用提供的模拟数据集作为输入:
house_id = c("id1", "id2", "id3", "id4", "id5", "id6") value_2016 = c(1000, 1002, 2000, 20004, 1000, 9000) value_2017 = c(2000, 2402, 1400, 30004, 2000, 12000) value_2018 = c(4000, 3200, 600, 40004, 3000, 15000) df = data.frame(house_id, value_2016, value_2017, value_2018)
如果使用真实数据集
realact,只需要把后续代码中匹配列的规则替换为starts_with("tot_appr_val_")、年份提取规则替换为移除tot_appr_val_前缀即可,逻辑完全通用。
3. 数据整形与统计量计算
原始数据为宽表格式(每年价值单独占一列),需要先转换为适合统计、绘图的长表格式,再按年份分组计算所需的均值、最大值,计算时自动剔除NA值,适配原数据中的缺失值情况:
year_stat <- df %>% # 宽表转长表,拆分出年份和评估价值列 pivot_longer( cols = starts_with("value_"), names_to = "year", values_to = "appr_value", names_transform = ~as.numeric(str_remove(., "value_")) ) %>% # 按年份分组计算统计量 group_by(year) %>% summarise( 均值 = mean(appr_value, na.rm = TRUE), 最大值 = max(appr_value, na.rm = TRUE), .groups = "drop" )
运行后直接查看year_stat即可得到各年份对应的均值、最大值结果,和summary函数输出的统计值完全一致。
4. 绘制折线图
从提供的summary结果看,房屋评估价值的最大值(十亿级)和均值(数十万级)量级差异极大,单Y轴会导致均值折线被压缩到几乎贴在X轴无法辨识,这里提供两种常用展示方案:
方案1:双Y轴折线图(适配两个指标的不同量级)
左轴对应均值刻度,右轴对应最大值刻度,两条折线用不同颜色区分:
ggplot(year_stat, aes(x = year)) + # 均值折线,绑定左Y轴 geom_line(aes(y = 均值, color = "年均值"), linewidth = 1.2) + geom_point(aes(y = 均值, color = "年均值"), size = 3) + # 最大值折线,绑定右Y轴,按量级比例做缩放适配 geom_line(aes(y = 最大值 / (max(最大值)/max(均值)), color = "年最大值"), linewidth = 1.2) + geom_point(aes(y = 最大值 / (max(最大值)/max(均值)), color = "年最大值"), size = 3) + # 双Y轴刻度设置 scale_y_continuous( name = "评估价值均值", sec.axis = sec_axis(~ . * (max(year_stat$最大值)/max(year_stat$均值)), name = "评估价值最大值") ) + # X轴年份刻度 scale_x_continuous(breaks = c(2016, 2017, 2018)) + # 颜色与图例设置 scale_color_manual(values = c("年均值" = "#2c7bb6", "年最大值" = "#d7191c")) + labs(x = "年份", color = "统计指标", title = "2016-2018年房屋评估价值变化趋势") + theme_bw() + theme( axis.title.y.left = element_text(color = "#2c7bb6"), axis.title.y.right = element_text(color = "#d7191c"), legend.position = "bottom" )
方案2:对数坐标轴折线图(避免双Y轴的统计误导问题)
如果不希望使用双Y轴,可以直接对Y轴取10为底的对数,两个量级的指标可以在同一坐标轴下清晰展示变化趋势:
ggplot(year_stat, aes(x = year)) + geom_line(aes(y = 均值, color = "年均值"), linewidth = 1.2) + geom_point(aes(y = 均值, color = "年均值"), size = 3) + geom_line(aes(y = 最大值, color = "年最大值"), linewidth = 1.2) + geom_point(aes(y = 最大值, color = "年最大值"), size = 3) + scale_y_log10(name = "评估价值(对数10刻度)") + scale_x_continuous(breaks = c(2016, 2017, 2018)) + scale_color_manual(values = c("年均值" = "#2c7bb6", "年最大值" = "#d7191c")) + labs(x = "年份", color = "统计指标", title = "2016-2018年房屋评估价值变化趋势") + theme_bw() + theme(legend.position = "bottom")
内容的提问来源于stack exchange,提问作者tchoup
相关产品推荐
相关产品推荐

