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

使用ggplot绘制双变量百分比堆叠柱状图的技术问询

用ggplot创建符合需求的堆叠柱状图

没问题,我来帮你搞定这个堆叠柱状图!核心思路很明确:每个年份的柱子总高度是当年的投票率,而各政党的堆叠部分要占满这个柱子的100%空间——所以得先把每个政党的得票率转换成对应年份投票率的实际占比,再用ggplot绘制。

第一步:准备示例数据

先构建符合你描述的数据集,包含3个年份、3个政党的得票率,以及对应年份的投票率:

library(tidyverse)

# 创建示例数据集
vote_data <- tibble(
  year = rep(c(1990, 2000, 2010), each = 3),
  party = rep(c("a", "b", "c"), 3),
  # 各政党的得票率(每一年的三个政党得票率合计为100%)
  party_vote_pct = c(45, 35, 20, 50, 30, 20, 40, 40, 20),
  # 对应年份的总投票率
  turnout_pct = rep(c(96.7, 85.2, 78.5), each = 3)
) %>%
  # 计算每个政党在柱子中的实际高度:(政党得票率/100)*当年投票率
  mutate(adjusted_height = (party_vote_pct / 100) * turnout_pct)

第二步:绘制堆叠柱状图

用ggplot绘制,同时添加清晰的标签展示政党得票占比和年份总投票率:

ggplot(vote_data, aes(x = factor(year), y = adjusted_height, fill = party)) +
  # 绘制堆叠柱状图,白色分隔线区分政党
  geom_col(position = "stack", color = "white") +
  # 在每个堆叠块中添加政党得票率标签(居中显示)
  geom_text(aes(label = paste0(party_vote_pct, "%")), 
            position = position_stack(vjust = 0.5), color = "white", size = 4) +
  # 在每个柱子顶部添加当年总投票率标签
  geom_text(aes(label = paste0(turnout_pct, "%"), y = turnout_pct), 
            position = position_dodge(width = 0.9), vjust = -0.5, size = 4.5) +
  # 调整图表标签和样式
  labs(
    x = "年份",
    y = "投票率(%)",
    fill = "政党",
    title = "各年份投票率及政党得票占比分布",
    subtitle = "每个柱子总高度为当年投票率,堆叠部分为政党得票占该投票率的比例"
  ) +
  theme_minimal() +
  # 设置y轴范围,方便对比不同年份的投票率
  scale_y_continuous(limits = c(0, 100), breaks = seq(0, 100, 10))

关键细节解释

  • adjusted_height的作用:原始的政党得票率是相对于有效选票的100%,我们需要把它转换成相对于当年总投票率的实际高度,这样堆叠起来的总和正好等于当年的投票率(比如1990年的三个政党adjusted_height相加就是96.7%)。
  • 堆叠与标签位置:position = "stack"确保柱状图按政党堆叠,position_stack(vjust = 0.5)让政党得票率标签居中在每个堆叠块内;顶部的总投票率标签用position_dodge对齐每个柱子的位置,避免重叠。

内容的提问来源于stack exchange,提问作者Ruebenkraut

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:28:38