我在ggplot中使用facet_wrap
和facet_grid
绘制东西,比如:
ggplot(iris) + geom_histogram(aes(iris$Petal.Width)) + facet_grid(Species ~ .)
是否可以控制绘图中Species
个面板的顺序?这可以在不改变iris
数据帧或制作新数据帧的情况下完成吗?这里的默认显示为setosa、versicolor、virginica,但我想要不同的订单.谢谢
我在ggplot中使用facet_wrap
和facet_grid
绘制东西,比如:
ggplot(iris) + geom_histogram(aes(iris$Petal.Width)) + facet_grid(Species ~ .)
是否可以控制绘图中Species
个面板的顺序?这可以在不改变iris
数据帧或制作新数据帧的情况下完成吗?这里的默认显示为setosa、versicolor、virginica,但我想要不同的订单.谢谢
我不认为我真的可以满足您的"不创建新数据帧"要求,但您可以动态创建新数据帧:
ggplot(transform(iris,
Species=factor(Species,levels=c("virginica","setosa","versicolor")))) +
geom_histogram(aes(Petal.Width))+ facet_grid(Species~.)
或者,用tidyverse成语来说:
iris %>%
mutate(across(Species, factor, levels=c("virginica","setosa","versicolor"))) %>%
ggplot() +
geom_histogram(aes(Petal.Width))+
facet_grid(Species~.)
我同意如果有另一种方法来控制这一点会很好,但ggplot
已经是一个非常强大(和复杂)的引擎...
注意,(1)rows in the data set的顺序独立于(2)levels of the factor的顺序#2是factor(...,levels=...)
所改变的,ggplot
所看到的,以确定面的顺序.执行#1(按指定顺序对数据帧的行进行排序)是一个有趣的挑战.我想我应该先做#2,然后用order()
或arrange()
根据因子的数值进行排序:
neworder <- c("virginica","setosa","versicolor")
library(plyr) ## or dplyr (transform -> mutate)
iris2 <- arrange(transform(iris,
Species=factor(Species,levels=neworder)),Species)
我无法立即找到一种快速的方法来改变因子水平的顺序(你可以这样做,然后相应地重置因子水平的顺序).
一般来说,R中依赖于分类变量的级别顺序的函数基于因子级别顺序,而不是数据集中行的顺序:上面的答案更普遍地适用.