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

