如何在Base R中按prefinal组中位数对箱线图分组排序
按Prefinal组中位数降序排列箱线图的实现方案
要实现这个需求,核心是通过调整word变量的因子水平顺序,让它按照prefinal组中duration的中位数降序排列——因为箱线图的分组展示顺序是由因子的水平顺序决定的。具体步骤如下:
1. 计算Prefinal组各Word的中位数并排序
首先从数据中筛选出prefinal组的记录,计算每个word对应的duration中位数,再按中位数从高到低排序得到我们想要的word顺序:
# 提取prefinal组数据,计算每个word的duration中位数 prefinal_medians <- aggregate(duration ~ word, data = DATA[DATA$group == "prefinal", ], FUN = median) # 按中位数降序提取word的顺序 sorted_words <- prefinal_medians[order(-prefinal_medians$duration), "word"]
2. 重置Word的因子水平
把原数据中的word转换为因子,并指定其水平顺序为我们刚得到的sorted_words:
DATA$word <- factor(DATA$word, levels = sorted_words)
3. 绘制箱线图
现在再绘制箱线图,就会自动按照我们设定的顺序排列了,同时调整坐标轴标签让展示更清晰:
boxplot(DATA$duration ~ DATA$group + DATA$word, xaxt="n", col = rep(c("blue", "red"), length(sorted_words))) axis(1, at = seq(from=1.5, to= length(sorted_words)*2 - 0.5, by=2), labels = sorted_words, cex.axis = 0.9)
完整可重复示例代码
为了方便你测试,这里附上包含数据生成的完整代码(设置随机种子保证结果一致):
set.seed(123) # 固定随机种子,确保示例数据可重复 DATA <- data.frame( group = c(rep("prefinal",10), rep("final", 10)), word = c(sample(LETTERS[1:5], 10, replace = T), sample(LETTERS[1:5], 10, replace = T)), duration = rnorm(20) ) # 计算排序用的中位数 prefinal_medians <- aggregate(duration ~ word, data = DATA[DATA$group == "prefinal", ], FUN = median) sorted_words <- prefinal_medians[order(-prefinal_medians$duration), "word"] # 重置因子水平 DATA$word <- factor(DATA$word, levels = sorted_words) # 绘图 boxplot(DATA$duration ~ DATA$group + DATA$word, xaxt="n", col = rep(c("blue", "red"), length(sorted_words))) axis(1, at = seq(from=1.5, to= length(sorted_words)*2 - 0.5, by=2), labels = sorted_words, cex.axis = 0.9)
这样处理后,箱线图的分组顺序就完全符合你的要求啦~
内容的提问来源于stack exchange,提问作者Chris Ruehlemann
相关产品推荐
相关产品推荐

