如何在ggplot2的单个堆叠条形图各分段中垂直居中显示数值?
单个堆叠条形图的文本位置修正方案
核心问题排查
你的代码存在两个关键问题:
- 分组逻辑错误:计算文本位置时按
Variable分组,导致每个变量单独计算累计值,无法匹配堆叠的整体顺序。 - x轴映射错误:
x = variable(拼写错误,应为Variable)会将每个变量拆分为独立条形,而非堆叠成单个条形。
修正后的完整代码
1. 数据预处理
library(tidyverse) # 宽表转长表,并添加统一的x轴类别 sk <- sk %>% pivot_longer(cols = c(A, B, C, D, E, F), names_to = "Variable", values_to = "Value") %>% mutate(x_group = "总览") %>% # 固定x轴为单个类别 group_by(x_group) %>% mutate( # 计算每个堆叠分段的中间位置 cumulative = cumsum(Value) - Value / 2, # 保持变量的原始堆叠顺序,避免颠倒 Variable = fct_inorder(Variable) ) %>% ungroup()
2. 绘图代码
ggplot(data = sk, aes(x = x_group, y = Value, fill = Variable)) + geom_bar(position = "stack", stat = "identity") + geom_text(aes(y = cumulative, label = Value), size = 4) + xlab("") + ylab("") + theme_minimal() + theme(legend.position = "right")
关键调整说明
- 新增
x_group字段,确保所有变量都映射到同一个x轴类别,形成单个堆叠条形。 - 按
x_group分组计算cumulative,累计值基于整个堆叠的顺序,能精准定位每个分段的中间位置。 fct_inorder函数强制保持变量的原始顺序,解决文本和分段颠倒的问题。
内容的提问来源于stack exchange,提问作者Abaco
相关产品推荐
相关产品推荐

