ggplot:按变量值降序排序分面图的X轴标签
解决分面柱状图内X轴标签按对应value降序排列的问题
要实现每个分面里的X轴(make)按对应var的value降序排列,我们可以用两种方法来处理,下面分别说明:
方法一:用tidytext包快速实现(推荐)
这个包里的reorder_within()和scale_x_reordered()专门用来处理分面内的排序需求,不用手动折腾因子:
首先如果还没装tidytext包,先安装:
install.packages("tidytext")
然后修改你的绘图代码:
library(ggplot2) library(tidytext) # 你的原始数据加载代码 text <- " make,var,value fiat,mileage,2.1 astom,mileage,1.8 fiat,disp,1.4 astom,disp,1.7 " df <- read.table(textConnection(text), sep = ",", header = TRUE) # 调整后的绘图代码 ggplot(df, aes(x = reorder_within(make, -value, var), y = value)) + geom_bar(stat = 'identity') + facet_wrap(~ var, scales = "free", ncol=1) + scale_x_reordered() + # 自动处理X轴标签,去掉分组前缀 labs(x = "make")
这里reorder_within(make, -value, var)的意思是:按var分组,在每个组内让make按照-value(也就是value降序)重新排序;scale_x_reordered()则负责把X轴标签还原成原来的make名称,不会显示分组前缀。
方法二:手动处理因子(无需额外包)
如果你不想装新包,可以用dplyr来分组排序,手动生成带分组标识的因子,最后再清理X轴标签:
library(ggplot2) library(dplyr) # 原始数据加载 text <- " make,var,value fiat,mileage,2.1 astom,mileage,1.8 fiat,disp,1.4 astom,disp,1.7 " df <- read.table(textConnection(text), sep = ",", header = TRUE) # 分组排序并生成带前缀的因子 df_sorted <- df %>% group_by(var) %>% arrange(desc(value)) %>% # 每个var组内按value降序排列 mutate(make_ordered = factor(paste(make, var, sep = "__"), levels = paste(make, var, sep = "__"))) %>% # 生成带var前缀的因子,保证每个组的顺序独立 ungroup() # 绘图并清理X轴标签 ggplot(df_sorted, aes(x = make_ordered, y = value)) + geom_bar(stat = 'identity') + facet_wrap(~ var, scales = "free", ncol=1) + scale_x_discrete(labels = function(x) gsub("__.*", "", x)) + # 去掉标签里的__和后面的var内容 labs(x = "make")
这两种方法都能实现你要的效果:在mileage分面里fiat排在前面(因为2.1>1.8),在disp分面里astom排在前面(因为1.7>1.4)。
内容的提问来源于stack exchange,提问作者user3206440
相关产品推荐
相关产品推荐

