我在ggplot中使用facet_wrapfacet_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中依赖于分类变量的级别顺序的函数基于因子级别顺序,而不是数据集中行的顺序:上面的答案更普遍地适用.

R相关问答推荐

在R中,如何在使用tibble::enFrame % % unlist转换后从收件箱中重组嵌套列表?

NA仅省略具有NA的 Select 行

rvest函数read_html_live()不允许html_elements()正确读取

在特定列上滞后n行,同时扩展框架的长度

R Lubridate:舍入/快照日期时间到一天中最近的任意时间?

为什么当我try 在收件箱中使用合并功能时会出现回收错误?

从开始时间和结束时间导出时间

gt()从gt为相同内容的单元格 colored颜色 不同?

如果第一个列表中的元素等于第二个列表的元素,则替换为第三个列表的元素

标识R中多个列中缺少的唯一值

可以替代与NSE一起使用的‘any_of()’吗?

如何在科学记数法中显示因子

在R函数中使用加号

自定义gggraph,使geom_abline图层仅在沿x轴的特定范围内显示

R:如果为NA,则根据条件,使用列名模式将缺少的值替换为另一列中的值

R+reprex:在呈现R标记文件时创建可重现的示例

减go R中列表的所有唯一元素对

我如何使用tidyselect来传递一个符号数组,比如Pivot_Long?

如何在R中创建条形图,使条形图在y轴上围绕0.5而不是0构建条形图?

随机将数据帧中特定列上的某些行设置为NA