在R语言中绘制基于指定数据框的百分比堆叠条形图技术问询
我来帮你排查下问题,顺便给你两种靠谱的实现方案~
你的核心问题在于:手动计算了百分比后,又在geom_bar里用了position = "fill"——这个参数本身会自动把每个x轴分组的条形高度缩放到1(对应100%),等于做了重复缩放,自然得不到预期效果。另外你想要的是0-100的百分比刻度,手动计算的percent是0-1的小数,也需要调整显示逻辑。
方案一:让ggplot自动处理百分比(最简洁)
不需要手动计算占比,直接用原始数据,借助position="fill"自动计算,再把y轴刻度转成百分比格式:
library(ggplot2) library(dplyr) # 假设你的原始数据集叫df ggplot(df, aes(x = Period, fill = factor(AA))) + geom_bar(position = "fill") + # 把y轴的小数刻度转换成百分比显示 scale_y_continuous(labels = scales::percent) + # 可选:设置更清晰的轴标题和图例名称 labs(y = "占比(%)", fill = "AA类别") + # 解决Day1-Day99标签拥挤的问题,旋转x轴标签 theme(axis.text.x = element_text(angle = 45, hjust = 1))
这里把AA转成因子很重要,能让ggplot把它当作离散类别处理,避免出现奇怪的渐变填充色。
方案二:手动计算百分比(适合需要复用占比数据的场景)
如果你需要保留计算好的占比数据用于其他分析,就用这个方法,直接算出0-100的百分比,绘图时用stat="identity":
library(ggplot2) library(dplyr) # 先统计每个Period下AA各类别的次数,再计算百分比 df_summary <- df %>% count(Period, AA) %>% # 替代aggregate的更简洁写法 group_by(Period) %>% mutate(percent = n / sum(n) * 100) %>% # 直接算出0-100的百分比 ungroup() # 绘图 ggplot(df_summary, aes(x = Period, y = percent, fill = factor(AA))) + geom_bar(stat = "identity") + labs(y = "占比(%)", fill = "AA类别") + theme(axis.text.x = element_text(angle = 45, hjust = 1))
内容的提问来源于stack exchange,提问作者Marble
相关产品推荐
相关产品推荐

