我正在尝试在 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))
答案 0 :(得分:29)
以下命令将通过重建“处理”和“物种”因子来创建所需的顺序,并使用明确的级别手动排序:
mydata$Treatment = factor(mydata$Treatment,c("L","M","H"))
mydata$Species = factor(mydata$Species,c("G","R","B"))
编辑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
乍看之下它不会改变因素,但确实会改变数据的存储方式。
这里重要的是,许多绘图函数将绘制最左边的最低枚举,然后是下一个,等等。
如果仅使用factor(X)
创建因子,则通常枚举基于因子水平的字母顺序(例如“H”,“L”,“M”)。如果您的标签具有不同于字母的常规排序(即“H”,“M”,“L”),这可能会使您的图形看起来很奇怪。
乍一看,似乎这个问题可能是由于数据框中数据的排序 - 即如果我们只能将所有“H”放在顶部而“L”放在底部,那么它就可以了。它没有。但是,如果希望您的标签与数据中第一次出现的顺序相同,则可以使用以下格式:
mydata$Treatment = factor(mydata$Treatment, unique(mydata$Treatment))
答案 1 :(得分:11)
This earlier StackOverflow question显示了如何根据数值重新排序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))
创建您想要创建的图表。
这也等同于此处提供的其他解决方案。