如何使用ggplot创建含指定堆叠段的堆叠条形图(基于两列数据)
堆叠条形图实现方案
需求说明
要制作的堆叠条形图需满足:
- 每个条形总高度等于
gdp_per_capita列的值 - 每个条形包含两个堆叠段:一个是
gdp_per_capita_agg_percen(对应农业GDP部分),另一个是总GDP减去该值的剩余部分
问题分析
当前代码无法实现堆叠,是因为只传入了单一的y = gdp_per_capita值,ggplot没有收到多个堆叠类别的数据。要实现堆叠,需要先把数据整理为长格式(每个堆叠类别占一行)。
解决步骤及代码
1. 数据预处理
首先计算剩余GDP部分,并把数据转换为长格式:
# 加载tidyverse包(若未安装先运行install.packages("tidyverse")) library(tidyverse) # 计算总GDP减去农业GDP后的剩余部分 df2 <- df2 %>% mutate(gdp_remaining = gdp_per_capita - gdp_per_capita_agg_percen) # 转换为长格式,拆分出两个GDP类别 df_long <- df2 %>% pivot_longer( cols = c(gdp_per_capita_agg_percen, gdp_remaining), names_to = "GDP_Category", values_to = "Value" ) # 给类别重命名,让图例更直观 df_long <- df_long %>% mutate(GDP_Category = case_when( GDP_Category == "gdp_per_capita_agg_percen" ~ "农业GDP", GDP_Category == "gdp_remaining" ~ "其他GDP" ))
2. 绘制堆叠条形图
ggplot(df_long, aes(x = Country_Name, y = Value, fill = GDP_Category)) + geom_bar(stat = "identity", position = "stack") + # 设置标签和标题 labs( x = "国家名称", y = "人均GDP", fill = "GDP类别", title = "人均GDP构成(农业VS其他)" ) + # 旋转x轴标签,避免名称重叠 theme(axis.text.x = element_text(angle = 45, hjust = 1))
效果说明
- 转换长格式后,每个国家对应两行数据,分别对应农业GDP和其他GDP部分
fill = GDP_Category用来区分两个堆叠段,position = "stack"会自动将两个段堆叠在一起,总高度正好等于原gdp_per_capita的值- 可根据需求自行调整颜色、字体等样式
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

