27

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

我正在使用的数据场如下所示:

Nitrogen    Species    Treatment
2           G          L
3           R          M
4           G          H
4           B          L
2           B          M
1           G          H

我试过了:

boxplot(mydata$Nitrogen~mydata$Species*mydata$Treatment)

这按字母顺序排列了盒子(前三个是“高”处理,然后在这三个中,它们按物种名称的字母顺序排列)。

替代文字

我希望箱线图的顺序为低>中>高,然后在每个组中为该物种 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")

然后:

boxplot(mydata$Nitrogen~f)

然而,这些盒子仍然以相同的顺序排列。标签现在不同了,但盒子没有移动。

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

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)

这给出了我想要的,但我更愿意以一种更优雅的方式做到这一点,所以我不必为更大的数据集单独拉出每一个。


可加载数据:

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))
4

2 回答 2

33

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

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

mydata$Species = factor(mydata$Species,c("G","R","B"))

替代文字


编辑 1:哎呀,我已将其设置为 HML 而不是 LMH。定影。

编辑2:因子(X,Y)做什么:

如果您在现有因子上运行 factor(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

它不会改变乍一看的因素,但它确实改变了数据的存储方式。

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

如果您简单地使用factor(X)然后创建因子,则枚举通常基于因子水平的字母顺序(例如“H”、“L”、“M”)。如果您的标签具有不同于字母的常规顺序(即“H”、“M”、“L”),这会使您的图表看起来很奇怪。

乍一看,问题似乎是由于数据帧中数据的顺序造成的——也就是说,如果我们可以将所有“H”放在顶部,“L”放在底部,那么它会起作用。它没有。但是,如果您希望标签以与数据中第一次出现的顺序相同的顺序出现,则可以使用以下形式:

 mydata$Treatment = factor(mydata$Treatment, unique(mydata$Treatment))
于 2010-11-23T21:07:04.093 回答
12

这个较早的 StackOverflow 问题显示了如何boxplot根据数值对 a 重新排序;您在这里需要的可能只是从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))

它创建了您要创建的图表。

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

于 2010-11-23T20:46:48.567 回答