You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 22:32:39