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

如何用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()

关键调整说明

  1. 按总量排序:
    用fct_reorder(name, totalCost)将name按totalCost从小到大排序;若需从大到小,改为fct_reorder(name, -totalCost)

  2. 实际数值堆叠:
    替换position = "fill"为position = "stack"(或省略,geom_col默认堆叠),确保展示真实成本总和而非百分比

  3. 总量标签添加:
    直接使用原始数据集data_test(每个姓名对应唯一总量),通过hjust = -0.1将标签放在条形外侧,避免与条形重叠

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 05:27:43