R语言ggplot使用scale_y_discrete自定义标签时顺序错位问题求解
问题成因
你在aes(y = reorder(name, share))中对y轴维度做了排序,此时y轴刻度的顺序是按share值升序排列的商户名,和原数据框col中默认的A-T字母序完全不一致。而你直接向scale_y_discrete(labels)传入了原数据框顺序拼接的标签向量,标签顺序是原数据的字母序,和已经重排的刻度顺序无法匹配,最终就出现了标签和柱子错位的问题。
修复方案
有两种常用的修复方式,推荐使用第一种函数式标签的方案,无需提前修改原始数据:
- 方案一:利用
scale_y_discrete的labels参数支持传入处理函数的特性,自动匹配排序后的刻度值对应的活跃天数
col %>% ggplot(aes(y = reorder(name, share), x = share)) + geom_col() + labs(x = "Share", y = "Merchant") + scale_y_discrete(labels = function(x) { paste0(x, " (", col$active_days[match(x, col$name)], ")") })
这里的参数x就是已经按share排序后的商户名向量,通过match函数匹配到对应商户的活跃天数再拼接,完全不会出现错位问题。
- 方案二:提前将商户名处理为带活跃天数的有序因子,直接映射到y轴
col %>% mutate( # 先按share对商户名排序 name = reorder(name, share), # 生成最终要显示的标签 y_label = paste0(name, " (", active_days, ")"), # 保持标签的顺序和排序后的商户名一致 y_label = reorder(y_label, share) ) %>% ggplot(aes(y = y_label, x = share)) + geom_col() + labs(x = "Share", y = "Merchant")
这种方式更直观,适合需要多次复用标签的场景。
内容的提问来源于stack exchange,提问作者R.W.
相关产品推荐
相关产品推荐

