如何用ggplot创建带排序的横向堆叠柱状图并添加总量标签
横向堆叠柱状图:排序与总量标签解决方案
核心问题修正
你的代码存在两个关键问题:
- 使用
position = "fill"导致柱状图显示为百分比堆叠,而非实际成本总和 - 未对条形按
totalCost排序,也未添加总量标签的逻辑
另外,pivot_longer的用法是正确的,长格式数据是绘制堆叠柱状图的标准格式。
修正后完整代码
library(tidyverse) data_test <- tribble( ~name, ~cost1, ~cost2, ~totalCost, "John", 10, 40, 50, "Martin", 21, 35, 56, "Dave", 28, 40, 68, "Dan", 18, 35, 53, "Michael", 15, 80, 95 ) # 重构为长格式数据(你的写法正确,保留即可) df <- data_test %>% pivot_longer(cols = c(cost1, cost2), names_to = "cost", values_to = "value") ggplot(df, aes(x = fct_reorder(name, totalCost), y = value, fill = cost)) + geom_col(position = "stack") + # geom_col替代geom_bar(stat="identity"),更简洁 # 添加总量标签:调用原始数据集,放在条形外侧 geom_text(data = data_test, aes(x = name, y = totalCost, label = totalCost), hjust = -0.1, color = "#333333") + coord_flip() + labs(x = "姓名", y = "成本", fill = "成本类型") + theme_minimal()
关键调整说明
按总量排序:
用fct_reorder(name, totalCost)将name按totalCost从小到大排序;若需从大到小,改为fct_reorder(name, -totalCost)实际数值堆叠:
替换position = "fill"为position = "stack"(或省略,geom_col默认堆叠),确保展示真实成本总和而非百分比总量标签添加:
直接使用原始数据集data_test(每个姓名对应唯一总量),通过hjust = -0.1将标签放在条形外侧,避免与条形重叠
内容的提问来源于stack exchange,提问作者paolotroia
相关产品推荐
相关产品推荐

