使用ggplot绘制100%堆叠面积图:LF与HF数据集占比可视化需求
需求:绘制LF与HF各变量的100%堆叠面积图
我手上有两个数据框LF和HF,数据示例如下:
head(LF) # Year SS SS_CQT SRP SRP_CQT TDP TDP_CQT TP TP_CQT # 1 2009 386.18 1164.3966 4586 12.30089 5285 14.23955 6707 18.17906 # 2 2010 268.72 884.9963 4354 13.37728 4927 15.20045 6078 18.81523 # 3 2011 347.61 746.7686 6924 12.25466 7917 13.84788 9302 16.93291 # 4 2012 170.68 1218.6758 2471 16.39350 3006 19.60066 3670 24.18561 head(HF) # Year SS SS_CQT SRP SRP_CQT TDP TDP_CQT TP TP_CQT # 1 2009 184.44 4055.367 535 11.53037 621 13.50632 1175 25.82282 # 2 2010 118.08 2726.272 737 14.44196 868 16.92781 1236 24.56522 # 3 2011 119.90 2208.308 663 10.19803 742 11.42253 1086 17.36818 # 4 2012 554.07 11913.003 2413 45.44719 2781 52.90863 4290 85.87746 # 5 2013 165.32 5926.628 424 15.93962 461 17.16547 873 31.70556
已知LF$SS + HF$SS = 总负荷(total load),我需要用ggplot2绘制各列变量(SS、SS_CQT、SRP、SRP_CQT等)中LF与HF的占比百分比100%堆叠面积图,效果参考分层展示不同来源在各年份占比变化的100%堆叠面积图。
解决方案步骤
1. 数据预处理:整理成ggplot适配的长格式
首先要把两个宽格式数据框合并,计算每个变量的总负荷,再算出LF和HF的占比,最后转成长格式方便绘图:
library(tidyverse) # 给两个数据框添加来源标识 LF <- LF %>% mutate(source = "LF") HF <- HF %>% mutate(source = "HF") # 合并两个数据框 combined_df <- bind_rows(LF, HF) # 转成长格式,按年份和变量分组计算占比 long_df <- combined_df %>% pivot_longer(cols = -c(Year, source), names_to = "variable", values_to = "value") %>% group_by(Year, variable) %>% mutate(total = sum(value), percentage = (value / total) * 100) %>% ungroup()
2. 绘制100%堆叠面积图
使用geom_area()配合position = "fill"实现100%堆叠效果,同时分面展示不同变量会更清晰:
ggplot(long_df, aes(x = Year, y = percentage, fill = source)) + geom_area(position = "fill", alpha = 0.7) + # 分面展示每个变量,每行2个图 facet_wrap(~variable, ncol = 2) + # 设置标签和主题样式 labs(title = "LF与HF各变量占比100%堆叠面积图", x = "年份", y = "占比(%)", fill = "来源") + theme_minimal() + theme(plot.title = element_text(hjust = 0.5, size = 14, face = "bold"), axis.text = element_text(size = 10), legend.position = "bottom")
如果希望所有变量在同一个图中展示(多系列堆叠),可以调整分组逻辑,但分面展示能更直观地对比每个变量的占比变化趋势。
内容的提问来源于stack exchange,提问作者Vasker Sharma
相关产品推荐
相关产品推荐

