使用facet_wrap与reorder_within时的分面内柱状图排序问题
解决ggplot2分面内柱状图排序及柱子拆分问题
你的问题出在两个关键细节上:一是geom_text里的position_dodge导致柱子与文本错位,二是scale_x_reordered引用了未定义的reorder_func,引发x轴标签处理错误,最终造成同类型柱子被拆分的混乱布局。
下面是修正后的可运行代码,能实现分面内按frequency降序排列的需求:
library(tidytext); library(ggplot2) ggplot(data=graphs_facet, aes(x = reorder_within(Type, frequency, Article.Categorization), y = frequency)) + geom_bar(stat = 'identity') + labs(x = "Graphs produced from analysis", y = "Frequency") + theme_classic() + # 移除position_dodge:每个x位置仅对应一个柱子,无需分组闪避 geom_text(aes(label=frequency), vjust=-0.25) + theme(axis.text.x = element_text(angle = 30, vjust = 0.9,hjust = 0.75, color = "black", size = 10), axis.title = element_text(color = "black"), axis.text.y = element_text(color = "black")) + # 直接使用scale_x_reordered:自动还原Type的原始名称,无需自定义标签函数 scale_x_reordered() + # 分面变量已为factor,无需重复转换;可选添加scales="free_x"让各分面x轴独立显示 facet_wrap(~Article.Categorization, scales = "free_x")
核心修改说明:
- 移除
position_dodge:你的数据中每个分面下的Type都是唯一值,每个x轴位置仅对应一个柱子,使用闪避参数会强制偏移元素,导致布局错乱。 - 简化
scale_x_reordered:reorder_within会给Type添加分组后缀(如Type[分组名]),scale_x_reordered默认会自动去除这些后缀,还原原始的图表类型名称,无需额外定义标签函数。 - 可选
scales="free_x":让每个分面的x轴只显示当前分面存在的图表类型,避免所有分面都加载全量Type标签,提升可读性(不需要可直接去掉该参数)。
运行后,每个分面内的柱状图会按frequency从高到低降序排列,同类型柱子不会被拆分,布局恢复正常。
内容的提问来源于stack exchange,提问作者Cassidy
相关产品推荐
相关产品推荐

