You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 07:15:43