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

使用reorder_within排序坐标轴标签时并列项如何保持字母序

解决方案

你需要给排序逻辑增加次要规则,数值并列时自动按姓名字母顺序排序,有两种实现方式:

方法1:直接传入双排序依据(推荐)

reorder_within本身支持多维度排序,你只需要把排序依据放在list里即可,第一优先级为-n(满足你「使用人数少的姓名在顶部、多的在底部」的需求),第二优先级为name(并列时按字母升序排列),修改后的代码如下:

mutate(decade = as.factor(decade),
       name = reorder_within(name, list(-n, name), decade))

替换你原来的reorder_within行即可,无需修改其他代码。

方法2:手动排序后指定因子水平(兼容性更好)

如果你的tidytext版本较低不支持多参数排序,可以先手动给数据按规则排序,再指定name的因子水平,逻辑更可控:

top_names %>%
  group_by(decade) %>%
  top_n(15) %>%
  ungroup() %>%
  # 先按分组、数值倒序、姓名字母正序排列
  arrange(decade, -n, name) %>%
  mutate(decade = as.factor(decade),
         # 手动指定因子水平为排序后的顺序,再调用reorder_within适配分面逻辑
         name = factor(name, levels = unique(name)) %>% reorder_within(., -n, decade)) %>%
  # 后续ggplot绘图代码和原来完全一致
  ggplot(aes(name, n, fill = decade)) +
  geom_col(show.legend = FALSE) +
  facet_wrap(~decade, scales = "free_y") +
  coord_flip() +
  scale_x_reordered() +
  scale_y_continuous(expand = c(0,0)) +
  labs(y = "Number of babies per decade",
       x = NULL,
       title = "What were the most common baby names in each decade?",
       subtitle = "Via US Social Security Administration")

原理解释

R的因子排序默认按你传入的排序变量优先级依次判断,数值相同的情况下会自动匹配次要排序规则,你把name作为第二排序键设为升序,就能保证数值并列的姓名永远按字母顺序排列,不会因为反转数值排序就打乱顺序。

内容的提问来源于stack exchange,提问作者eycramer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 05:36:07