使用ggplot2时如何更改箱线图的顺序?

34

这个问题是基于另一个 问题,我无法实现那里的答案。

定义:

df2 <- data.frame(variable=rep(c("vnu.shr","vph.shr"),each=10),
        value=seq(1:20))

绘图:

require(ggplot2)
qplot(variable,value, data=df2,geom="boxplot")+
geom_jitter(position=position_jitter(w=0.1,h=0.1))
我希望将箱线图的顺序改为相反的顺序(例如,一个在右侧,一个在左侧等)。
我尝试过使用“levels”、“ordered”、“relevel”、“rev”等对因子进行重新排序的各种方法,但似乎无法正确地使用语法。

这个问题在SO上已经被处理多次了。这里只是两个顶级的例子: https://dev59.com/D3A75IYBdhLWcg3wg5Zh https://dev59.com/PG025IYBdhLWcg3wf2OE - Roman Luštrik
@ Roman Luštrik 这或许说明了重新排序因子对于未经训练的人来说有多么令人困惑。我曾试图对数据框进行排序,使得因子按照字母顺序的相反顺序排列,然后将其重新编码为因子。但是这样做行不通,因为对于因子 z=c("b","a")R 应用的底层数字遵循字母顺序(这是有道理的),即数值编码为 z=c(2,1)。但现在我知道了,重新排序因子与重新排序数据框没有任何关系!当重新排序因子时,我们并没有重新排序数据,而是将底层数字更改为 z=c(1,2) - Fred
在绘图的目的中,因子的级别顺序决定了图中的排序。一旦你理解了这个,就会变得非常简单。关于重新排序的混淆问题...你有没有试过将lattice/ggplot绘图输出到pdf? :) 令人惊讶的是,在你发现这不是代码问题而是缺少一个“print”语句之前...... - Roman Luštrik
1
@Roman Luštrik 关于 PDF,您可能想要检查 ggsave 这里 - Fred
2个回答

62

你尝试过这个方法吗:

df2$variable <- factor(df2$variable,
    levels = c('vph.shr','vnu.shr'),ordered = TRUE)
我只是随意选择了一个排序方式,因为我怀疑我的系统配置与你的略有不同,所以我的“默认排序”可能会有所不同。但是,在指定级别时,您可以轻松更改它们的位置。
根据您的喜好,还有其他几个选项:
如果只想颠倒当前的排序:
factor(df2$variable,levels = rev(levels(df2$variable)),ordered = TRUE)

如果您不想手动输入每个级别,可以使用子集来指定特定的排序:

factor(df2$variable,levels = levels(df2$variable)[1:2],ordered = TRUE)

我以前使用过你的解决方案,它起作用了,但现在我正在使用它(已经测试了以上所有内容)在小提琴+箱线图上,它不想改变。有什么想法是什么原因呢? - stevec

10

你已经接受了一个(完全可以的)解决方案,但这里还有另一种使用relevel()的选择。我不确定为什么它对你不起作用?

#default plot
ggplot(df2, aes(variable, value)) + geom_boxplot()

enter image description here

#Reverse reverse!
df2$variable2 <- with(df2, relevel(variable, "vph.shr"))
ggplot(df2, aes(variable2, value)) + geom_boxplot()

enter image description here


14
照片出了什么问题吗?你是用Commodore 64或其他80年代的设备拍的吗?;-) - Fred
10
@Fred - 我在Microsoft Paint上手绘了它们,使它们看起来像ggplot设备的输出结果。实际上,我将这些图像保存为小的jpeg格式(2 x 2),以免分散注意力。但是,无论SO将这些图像托管在何处,它都有自己的想法关于图片应该有多大... - Chase
3
我喜欢邪恶像素的美学。很高兴知道如何复制它。 - Fred

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接