使用ggplot2时如何更改箱线图的顺序?
Posted
技术标签:
【中文标题】使用ggplot2时如何更改箱线图的顺序?【英文标题】:How to change order of boxplots when using ggplot2? 【发布时间】:2011-10-15 14:15:12 【问题描述】:这个问题来自另一个one。我无法在那里实现答案。
定义:
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 上处理过多次。这里只是两个***示例:***.com/questions/3253641/…***.com/questions/5967593/ordering-of-bars-in-ggplot @Roman Luštrik 这也许可以说明重新排序因素对初学者来说是多么令人困惑。一方面,我曾尝试对数据框进行排序,使因子按字母倒序排列,然后将其重新编码为因子。这对于因子z=c("b","a")
不起作用,R
应用的基础数字遵循字母顺序(这是有道理的) s.t.数字编码是z=c(2,1)
。但是,现在我知道,重新排序一个因子与重新排序数据框无关!在重新排序因子时,我们不会重新排序数据,而是将基础数字更改为 z=c(1,2)
说。
出于绘图目的,定义图中排序的因素是水平的顺序。一旦你得到它在你的皮肤下,这是一个平稳的旅程。关于重新排序的困惑......您是否尝试过将格子/ggplot 图输出到 pdf? :) 男孩,在您意识到这不是您的代码而是缺少print
语句之前...
@Roman Luštrik Re. PDF 你可能想检查ggsave
here
【参考方案1】:
你试过了吗:
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)
【讨论】:
我过去曾使用过您的解决方案并且它有效,但我现在在小提琴+箱线图上使用它(已经测试了以上所有内容)并且它不想改变。有什么想法吗?【参考方案2】:您已经接受了一个(非常好的)解决方案,但这里有另一个使用relevel()
的选项。我不确定为什么它不适合你?
#default plot
ggplot(df2, aes(variable, value)) + geom_boxplot()
#Reverse reverse!
df2$variable2 <- with(df2, relevel(variable, "vph.shr"))
ggplot(df2, aes(variable2, value)) + geom_boxplot()
【讨论】:
图片怎么了?您在哪里使用 Commodore 64 或其他 1980 年代设备? ;-) @Fred - 我在 microsoft paint 中手工绘制了它们,看起来像 ggplot 设备的输出。实际上,我将图像保存为小 jpeg (2 x 2),这样它们就不会分散注意力……但是无论 SO 托管图像的地方,它对图片应该有多大都有自己的想法…… 我喜欢evil pixel 美学。很高兴知道如何复制它。以上是关于使用ggplot2时如何更改箱线图的顺序?的主要内容,如果未能解决你的问题,请参考以下文章