R - 在箱线图中排序
Posted
技术标签:
【中文标题】R - 在箱线图中排序【英文标题】:R - ordering in boxplot 【发布时间】:2011-05-14 17:26:08 【问题描述】:我正在尝试在 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))
【问题讨论】:
boxplot(mydata$Nitrogen~mydata$Species*mydata$Treatment)
和 boxplot(mydata$Nitrogen~f)
为我生成了两个不同的图,后者按您想要的顺序排列。
顶部提示 - 使用代码按钮(或缩进 4)添加代码。它比使用 和 <br>
更干净
【参考方案1】:
以下命令将通过重建处理和物种因子来创建您需要的排序,并显式手动排序级别:
mydata$Treatment = factor(mydata$Treatment,c("L","M","H"))
mydata$Species = factor(mydata$Species,c("G","R","B"))
edit 1:糟糕,我将其设置为 HML 而不是 LMH。修复。
编辑 2:factor(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))
【讨论】:
查看我的帖子的编辑——我不相信这是真的。 更改级别不会调整列出的标签。但是,它确实会影响这些标签的基础枚举。有关更多详细信息,请参阅我在您的答案中的评论。请注意,图表现在按请求的顺序排列。【参考方案2】:This earlier *** 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))
它会创建您想要创建的图表。
这也等同于此处介绍的其他解决方案。
【讨论】:
我发现这个例子完全可以重现。使用以下命令加载他的数据:mydata=read.table(textConnection(scan(,"character",sep="\n")),head=TRUE)
然后将他的表格数据粘贴进去,然后是^D
ordered 在这里不是必需的 - 对因子水平的明确 order 是。
这并没有使我的问题错,但最糟糕的是效率低下。你投反对票的热情是怎么回事?
绝对数据框保持不变 - 它应该是。然而,通过改变因子中水平的顺序,boxplot、lattice 和 ggplot 等绘图函数在屏幕上以不同的顺序绘制数据。
@Dirk 他的评论对于 ggplot 是正确的,其中需要正确顺序的因子而不是有序因子。以上是关于R - 在箱线图中排序的主要内容,如果未能解决你的问题,请参考以下文章