在R中基于频率表在单个绘图中创建4个是非条形图
问题需求
我有一个数据集,包含4个分类变量:
- 受访者年少时是否享有免费校餐(FSM)
- 受访者父母是否上过大学
- 受访者在校期间是否学习过A-level戏剧
- 受访者的学校是否开设A-level戏剧
各变量取值为"yes"、"no"或"not applicable"。需要把这4个变量的是非条形图整合到一张图里(可保存为.png),每个子图只保留yes和no的条形。
我已经能生成单个变量(以FSM为例)的频率表和条形图,但不知道怎么合并多图:
# 单个变量频率表 FSM_df <- champions %>% count(FSM, sort = TRUE) %>% mutate(pct = prop.table(n)) percentage = label_percent()(FSM_df$pct) FSM_df$percentage = percentage # 单个变量条形图 ggplot(FSM_df, aes(x = FSM, y = n, fill = "#fe8080")) + geom_bar(stat = "identity", show.legend = FALSE) + coord_flip() + labs(x = "FSM", y = "Number of Champions") + geom_text(aes(label = percentage), color = "#662483")
解决方案
1. 转换数据为长格式
先把宽格式数据集转成长格式,同时过滤掉not applicable的取值,方便批量处理所有变量:
library(tidyverse) library(scales) # 选择目标变量并转长格式,可根据实际需求修改变量名称 long_df <- champions %>% select( "年少时享有免费校餐" = FSM, "父母上过大学", "在校学习过A-level戏剧", "学校开设A-level戏剧" ) %>% pivot_longer(cols = everything(), names_to = "变量名称", values_to = "取值") %>% filter(取值 %in% c("yes", "no"))
2. 批量计算频数与百分比
按每个变量分组,统一计算频数和百分比:
summary_df <- long_df %>% group_by(变量名称, 取值) %>% summarise(受访者数量 = n(), .groups = "drop") %>% group_by(变量名称) %>% mutate( 占比 = prop.table(受访者数量), 百分比文本 = label_percent(accuracy = 1)(占比) # 保留整数百分比,可调整accuracy参数 )
3. 绘制合并多图
用facet_wrap实现子图排列,保持统一样式:
ggplot(summary_df, aes(x = 取值, y = 受访者数量, fill = "#fe8080")) + geom_bar(stat = "identity", show.legend = FALSE) + # 调整文本位置,避免被图表边缘截断 geom_text(aes(label = 百分比文本), color = "#662483", vjust = 0.5, hjust = -0.1) + coord_flip() + # 按变量拆分子图,y轴独立适配各变量的频数范围 facet_wrap(~变量名称, scales = "free_y") + labs(x = "", y = "受访者数量") + theme_bw() # 可选:更换主题让图表更清爽
4. 保存图片
用ggsave导出为png格式:
ggsave( "多变量是非条形图.png", plot = last_plot(), width = 10, height = 8, dpi = 300 )
注意事项
- 若变量的中文名称需要调整,直接修改
select语句里的重命名部分即可 scales = "free_y"参数让每个子图的y轴范围独立,避免因不同变量频数差异大导致小数据子图显示失真- 可根据实际图表效果调整
geom_text的vjust和hjust参数,优化百分比文本的显示位置
内容的提问来源于stack exchange,提问作者Jess
相关产品推荐
相关产品推荐

