使用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
相关产品推荐
相关产品推荐

