如何按区域与响应量排序geom_bar频率柱状图
解决思路:按区域分组后排序郡的顺序
要实现先按区域(西海岸在前、东海岸在后),再在每个区域内按响应量降序排列的需求,核心是重新定义county的因子水平顺序——让西海岸的郡按响应数从多到少排,之后跟着东海岸的同规则排序郡。直接用fct_infreq只会全局按响应数排序,不会考虑区域分组,这也是你之前尝试没生效的原因。
具体实现步骤
1. 预处理数据,确定郡的排序规则
先用dplyr统计每个郡的响应数,同时关联所属区域,然后按区域优先级+响应数降序排序:
library(dplyr) library(forcats) library(ggplot2) # 统计每个郡的响应数,绑定区域信息 county_order_df <- df %>% group_by(region, county) %>% summarise(response_count = n(), .groups = "drop") %>% # 先按区域排序(West Coast 优先),再按响应数降序 arrange(desc(region == "West Coast"), desc(response_count))
2. 重新设置county的因子顺序
把原数据中的county转换成按上述顺序排列的因子:
df$county <- fct_relevel(df$county, county_order_df$county)
3. 绘制目标图表
现在直接用处理好的因子顺序绘图,就能得到你想要的效果:
ggplot(df, aes(x = county, y = stat(count), fill = region)) + geom_bar() + coord_flip() + scale_y_continuous() + ggtitle("Responses by County") + ylab("Number of Responses") + xlab("County") + labs(fill = "Region") + geom_text(stat='count', aes(label=..count..), vjust = .5, hjust = -1)
为什么之前的interaction参数没效果?
group = interaction(region, county)只是告诉ggplot如何分组计算统计量,但并没有改变x轴上county的显示顺序——你的核心需求是调整因子水平的顺序,而不是分组计算,所以这个参数不会带来视觉上的变化。
内容的提问来源于stack exchange,提问作者Elizabeth Brown
相关产品推荐
相关产品推荐

