基于ggplot2按变量分布比例排序条形图及分面加均值线问题
解决ggplot2可视化需求的实现方案
1. 数据预处理(基于dplyr)
先计算各区域的不幸福比例,将区域转换为按该比例降序排列的有序因子,确保条形图的排序符合要求:
library(dplyr) library(ggplot2) # 计算全局各区域的不幸福比例,用于排序 region_global_order <- your_data %>% group_by(scode1_22) %>% summarise(unhappy_pct = mean(utsugds2gp_22 == 1, na.rm = TRUE)) %>% arrange(desc(unhappy_pct)) %>% pull(scode1_22) # 将原数据的区域列转为有序因子 your_data <- your_data %>% mutate(scode1_22 = factor(scode1_22, levels = region_global_order))
2. 构建分面条形图并添加均值线
直接用stat_summary实现条形绘制与均值线添加,结合分面功能完成需求:
ggplot(your_data, aes(x = scode1_22, y = as.numeric(utsugds2gp_22 == 1))) + # 绘制各区域的不幸福比例条形 stat_summary(fun = mean, geom = "col", fill = "#2563eb", alpha = 0.8) + # 为每个分面添加该组的不幸福比例均值虚线 stat_summary(fun = mean, geom = "hline", color = "#dc2626", linetype = "dashed", size = 1, aes(yintercept = after_stat(y))) + # 按收入组分面,x轴随分面自由调整避免重叠 facet_wrap(~income_3gp, scales = "free_x") + # 调整x轴标签角度,优化可读性 theme(axis.text.x = element_text(angle = 45, hjust = 1)) + labs(x = "区域", y = "不幸福比例", title = "不同收入组下各区域不幸福比例分布(全局降序)")
可选:分面内单独排序
如果需要每个收入组内的区域按自身不幸福比例单独排序,可借助tidytext包的工具简化操作:
library(tidytext) ggplot(your_data, aes(x = reorder_within(scode1_22, as.numeric(utsugds2gp_22 == 1), income_3gp), y = as.numeric(utsugds2gp_22 == 1))) + stat_summary(fun = mean, geom = "col", fill = "#2563eb", alpha = 0.8) + stat_summary(fun = mean, geom = "hline", color = "#dc2626", linetype = "dashed", size = 1, aes(yintercept = after_stat(y))) + facet_wrap(~income_3gp, scales = "free_x") + scale_x_reordered() + theme(axis.text.x = element_text(angle = 45, hjust = 1)) + labs(x = "区域", y = "不幸福比例", title = "不同收入组下各区域不幸福比例分布(组内降序)")
关键说明
- 若
utsugds2gp_22本身已是0/1数值,可直接用y = utsugds2gp_22替代as.numeric(utsugds2gp_22 == 1); stat_summary自动处理分组均值计算,避免手动统计后绘图的冗余步骤;scales = "free_x"确保每个分面的x轴只显示当前组的区域,避免标签拥挤。
内容的提问来源于stack exchange,提问作者Alice Chen
相关产品推荐
相关产品推荐

