带均值点的箱线图:为分类变量获得相同的顺序

boxplot with mean points: getting the same order for categorical variable

我想在 R 中显示具有 mean 值的箱线图。我的箱线图代表 6 个不同站点上的过氧化氢酶 activity,我想从北到南重新排序,最后有一个参考站点(N1、N2、M1、M2、S1、S2、R)。我可以像这样轻松地重新排序箱线图:

levels(data$site)
[1] "S2" "N1" "R" "N2" "S1" "M1" "M2"
x = factor(data$site,levels(data$site)[c(2,4,6,7,5,1,3)])
boxplot(catalase~x, data)

但是 mean 值不遵循新的顺序。 我这样称呼平均值:

means<-tapply(data$catalase, data$site, mean)
points(means, col="red", pch=19)

并尝试像这样重新排序:

reordered_means = factor(means,levels(means)[c(2,4,6,7,5,1,3)])

但显然这没有意义,因为它不起作用。 有什么建议吗?

你需要的不是

reordered_means = factor(means,levels(means)[c(2,4,6,7,5,1,3)])

但是

reordered_means = means[c(2,4,6,7,5,1,3)]

例子

## toy data: z ~ site
site <- gl(7 , 5, labels = c("S2", "N1", "R", "N2", "S1", "M1", "M2"))
set.seed(0); z <- round(rnorm(35), 2)

## re-level
piv <- c(2,4,6,7,5,1,3)  ## pivoting index
x <- factor(site, levels(site)[piv])

## old mean before re-levelling
means <- tapply(z, site, mean)

## new mean after re-levelling
reordered_means <- means[piv]
#    N1     N2     M1     M2     S1     S2      R 
#-0.074 -0.370 -0.066 -0.226  0.206  0.788 -0.356 

## we can verify this by computing from scratch
reordered_means <- tapply(z, x, mean)
#    N1     N2     M1     M2     S1     S2      R 
#-0.074 -0.370 -0.066 -0.226  0.206  0.788 -0.356 

你只需要在你的数据集中重新排序后重新计算平均值(也可能纠正代码中的一些小错误)

data(mtcars)
mtcars$gear <- factor(mtcars$gear)
boxplot(mpg~gear, mtcars)
means=tapply(mtcars$mpg, mtcars$gear, mean)
points(means, col="red", pch=19)

mtcars$gear <- factor(mtcars$gear, levels=levels(mtcars$gear)[c(2,3,1)])
means=tapply(mtcars$mpg, mtcars$gear, mean)
boxplot(mpg~gear, mtcars)
points(means, col="red", pch=19)