如何用R ggplot绘制多分类变量的百分比堆叠水平条形图
绘制百分比堆叠水平条形图的解决方法
要实现你需要的图表,核心是把当前的宽格式数据转换成ggplot能识别的长格式数据,再计算各选项的占比,具体步骤如下:
1. 加载工具包
先加载tidyverse(包含ggplot2和数据处理相关工具):
library(tidyverse)
2. 转换数据格式
假设你的数据框名为df,用pivot_longer把每一列(A/B/C)转为独立的变量条目,同时处理NA值(如果需要把NA作为一个明确类别展示):
df_long <- df %>% pivot_longer(cols = everything(), names_to = "变量", values_to = "选项") %>% # 把NA替换成文本类别,若不想显示NA,就换成filter(!is.na(选项)) mutate(选项 = replace_na(选项, "NA"))
3. 计算各选项百分比
按每个变量分组,统计每个选项的占比:
df_percent <- df_long %>% group_by(变量, 选项) %>% summarise(数量 = n(), .groups = "drop") %>% group_by(变量) %>% mutate(百分比 = 数量 / sum(数量) * 100)
4. 绘制水平堆叠条形图
用ggplot绘制图表,搭配geom_col实现堆叠效果,添加百分比标签让结果更直观:
ggplot(df_percent, aes(x = 百分比, y = 变量, fill = 选项)) + geom_col(position = "stack") + # 在每个堆叠块中间添加百分比标签 geom_text(aes(label = paste0(round(百分比), "%")), position = position_stack(vjust = 0.5)) + # 调整图表标签和基础样式 labs(title = "变量选项百分比分布", x = "百分比", y = "变量", fill = "选项") + theme_minimal()
如果不想提前计算百分比,也可以让ggplot自动计算比例,简化代码:
ggplot(df_long, aes(x = 1, y = 变量, fill = 选项)) + geom_col(position = "fill") + # 将x轴刻度转为百分比格式 scale_x_continuous(labels = scales::percent_format()) + # 添加自动计算的百分比标签 geom_text(aes(label = after_stat(percent)), stat = "count", position = position_fill(vjust = 0.5), format = scales::percent_format()) + labs(title = "变量选项百分比分布", x = "百分比", y = "变量", fill = "选项") + theme_minimal()
额外调整说明
- 若不需要展示NA类别,把数据转换步骤中的
replace_na换成filter(!is.na(选项))即可。 - 可以用
scale_fill_manual(values = c("Sim" = "#2E8B57", "Não" = "#FF6347", "NA" = "#CCCCCC"))自定义堆叠块的颜色,匹配你想要的视觉效果。
内容的提问来源于stack exchange,提问作者Marcelo
相关产品推荐
相关产品推荐

