使用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
相关产品推荐
相关产品推荐

