R - 在boxplot中排序

Rob*_*ert 26 r boxplot

我试图在R中生成一系列由2个因子分组的箱形图.我已经设法制作了情节,但我无法按正确的方向订购.

我使用的数据库看起来像这样:

Nitrogen    Species    Treatment
2           G          L
3           R          M
4           G          H
4           B          L
2           B          M
1           G          H
Run Code Online (Sandbox Code Playgroud)

我试过了:

boxplot(mydata$Nitrogen~mydata$Species*mydata$Treatment)
Run Code Online (Sandbox Code Playgroud)

按字母顺序排列方框(前三个是"高"处理,然后在这三个中按字母顺序按种类名称排序).

替代文字

我希望箱形图有序为低>中>高,然后在每个群中G> R> B为物种.

所以我尝试在公式中使用一个因子:

f = ordered(interaction(mydata$Treatment, mydata$Species), 
            levels = c("L.G","L.R","L.B","M.G","M.R","M.B","H.G","H.R","H.B")
Run Code Online (Sandbox Code Playgroud)

然后:

boxplot(mydata$Nitrogen~f)
Run Code Online (Sandbox Code Playgroud)

但是盒子仍然按照相同的顺序装鞋.标签现在不同了,但盒子没有移动.

我已经取出了每组数据并将它们一起单独绘制在一起:

lg = mydata[mydata$Treatment="L" & mydata$Species="G", "Nitrogen"]
mg = mydata[mydata$Treatment="M" & mydata$Species="G", "Nitrogen"]
hg = mydata[mydata$Treatment="H" & mydata$Species="G", "Nitrogen"]
etc ..

boxplot(lg, lr, lb, mg, mr, mb, hg, hr, hb)
Run Code Online (Sandbox Code Playgroud)

这给了我想要的东西,但我宁愿这样做在一个更优雅的方式,所以我没有去拉每一个出来单独进行更大的数据集.


可装载数据:

mydata <-
structure(list(Nitrogen = c(2L, 3L, 4L, 4L, 2L, 1L), Species = structure(c(2L, 
3L, 2L, 1L, 1L, 2L), .Label = c("B", "G", "R"), class = "factor"), 
    Treatment = structure(c(2L, 3L, 1L, 2L, 3L, 1L), .Label = c("H", 
    "L", "M"), class = "factor")), .Names = c("Nitrogen", "Species", 
"Treatment"), class = "data.frame", row.names = c(NA, -6L))
Run Code Online (Sandbox Code Playgroud)

Ale*_*own 31

以下命令将通过重建"处理"和"物种"因子来创建所需的顺序,并使用明确的级别手动排序:

mydata$Treatment = factor(mydata$Treatment,c("L","M","H"))

mydata$Species = factor(mydata$Species,c("G","R","B"))
Run Code Online (Sandbox Code Playgroud)

替代文字


编辑1:oops我把它设置为HML而不是LMH.定影.

编辑2:什么因素(X,Y)的作用:

如果在现有因子上运行因子(X,Y),它将使用Y中值的排序来枚举因子X中存在的值.以下是您的数据的一些示例.

> mydata$Treatment
[1] L M H L M H
Levels: H L M
> as.integer(mydata$Treatment)
[1] 2 3 1 2 3 1
> factor(mydata$Treatment,c("L","M","H"))
[1] L M H L M H                               <-- not changed
Levels: L M H                                 <-- changed
> as.integer(factor(mydata$Treatment,c("L","M","H")))
[1] 1 2 3 1 2 3                               <-- changed
Run Code Online (Sandbox Code Playgroud)

它乍看之下并没有改变因素,但它确实改变了数据的存储方式.

这里重要的是许多绘图函数将绘制最左边的最低枚举,然后是下一个,等等.

如果您仅使用factor(X)那时创建因子,那么通常枚举是基于因子水平的字母顺序,(例如"H","L","M").如果您的标签具有不同于字母的常规排序(即"H","M","L"),这可能会使您的图形看起来很奇怪.

乍一看,似乎问题是由于数据框中数据的排序 - 即如果我们只能将所有"H"置于顶部而"L"置于底部,那么它将起作用.它没有.但是,如果您希望标签的显示顺序与数据中第一次出现的顺序相同,则可以使用以下格式:

 mydata$Treatment = factor(mydata$Treatment, unique(mydata$Treatment))
Run Code Online (Sandbox Code Playgroud)

  • 更改级别不会调整列出的标签.但是,它确实会影响这些标签的基础枚举.有关详细信息,请参阅我的回答.请注意,图表现在处于请求的顺序. (2认同)

Dir*_*tel 12

此早期的StackOverflow问题显示了如何boxplot根据数值重新排序; 你在这里需要的只是从factor相关类型的转换ordered.但很难说,因为我们没有您的数据,并且您没有提供可重现的示例.

编辑使用您在变量中发布的数据集md并依赖我之前指出的解决方案,我们得到了

R> md$Species <- ordered(md$Species, levels=c("G", "R", "B"))
R> md$Treatment <- ordered(md$Treatment, levels=c("L", "M", "H"))
R> with(md, boxplot(Nitrogen ~ Species * Treatment))
Run Code Online (Sandbox Code Playgroud)

这会创建您要创建的图表.

这也等同于此处介绍的其他解决方案.