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

ggplot2柱状图未填满至100%问题求助

解决ggplot2堆叠柱状图无法填满100%的问题

问题原因

你当前的代码通过三次调用geom_col绘制柱子,但每个柱子都是从y=0起始,属于重叠绘制而非堆叠。如果三个百分比的总和不等于100,顶部会出现空白;即使总和为100,也只会显示最上层的柱子,无法呈现堆叠效果。

解决方案

1. 先检查数据准确性

确认每行的Porcentajes_Correctius + Porcentajes_Preventius + Porcentajes_Altres是否等于100。如果总和不符,需要先修正百分比的计算逻辑。

2. 转换数据为长格式并重新绘图

ggplot2推荐使用长格式数据处理分组堆叠图,配合position_fill()参数确保柱子填满100%:

library(ggplot2)
library(tidyr)

# 将宽格式数据转换为长格式
taula_long <- taula_final %>%
  pivot_longer(
    cols = c(Porcentajes_Correctius, Porcentajes_Preventius, Porcentajes_Altres),
    names_to = "Tipo de Trabajo",
    values_to = "Porcentaje"
  )

# 绘制100%堆叠柱状图
grafico <- ggplot(taula_long, aes(x = Instal.lació, y = Porcentaje, fill = `Tipo de Trabajo`)) +
  # position_fill() 自动将每组高度标准化为1(即100%)
  geom_col(width = 0.7, color = "black", position = position_fill()) +
  scale_fill_manual(
    values = c(
      "Porcentajes_Correctius" = "red",
      "Porcentajes_Preventius" = "green",
      "Porcentajes_Altres" = "orange"
    ),
    labels = c("Correctius", "Preventius", "Altres"),
    drop = FALSE
  ) +
  labs(x = "Instal.lació", y = "Porcentaje", fill = "Tipo de Trabajo") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
  # 将y轴刻度显示为百分比格式
  scale_y_continuous(labels = scales::percent_format())

print(grafico)

关键说明

  • pivot_longer():把宽格式的三列百分比数据转换为两列(类型+数值),符合ggplot2的绘图逻辑。
  • position_fill():强制每组柱子的总高度为1(100%),无论原始数据总和是否为100,都会填满整个柱子;如果确认数据总和已经是100,也可以用position_stack(),效果一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 09:32:46