如何以整洁的方式重新排序因子水平?

Dav*_*Mas 7 r ggplot2 dplyr tidyverse

嗨我通常使用如下代码来重新排序ggplot中的条形图或其他类型的图形.

正常情节(无序)

library(tidyverse)
iris.tr <-iris %>% group_by(Species) %>% mutate(mSW = mean(Sepal.Width)) %>%
  select(mSW,Species) %>% 
  distinct()
ggplot(iris.tr,aes(x = Species,y = mSW, color = Species)) +
  geom_point(stat = "identity")
Run Code Online (Sandbox Code Playgroud)

订购因子+有序情节

iris.tr$Species <- factor(iris.tr$Species,
                          levels = iris.tr[order(iris.tr$mSW),]$Species,
                          ordered = TRUE)
ggplot(iris.tr,aes(x = Species,y = mSW, color = Species)) + 
  geom_point(stat = "identity")
Run Code Online (Sandbox Code Playgroud)

因素线对我来说非常不愉快,我想知道为什么arrange()或其他一些功能无法简化这一点.我错过了什么?

注意:

这不起作用,但我想知道tidyverse中是否存在这样的东西.

iris.tr <-iris %>% group_by(Species) %>% mutate(mSW = mean(Sepal.Width)) %>%
  select(mSW,Species) %>% 
  distinct() %>% 
  arrange(mSW)
ggplot(iris.tr,aes(x = Species,y = mSW, color = Species)) + 
  geom_point(stat = "identity")
Run Code Online (Sandbox Code Playgroud)

Kon*_*lph 15

使用< forcats >:

iris.tr %>%
    mutate(Species = fct_reorder(Species, mSW)) %>%
    ggplot() +
    aes(Species, mSW, color = Species) +
    geom_point()
Run Code Online (Sandbox Code Playgroud)


Gre*_*gor 5

使用基对因子进行重新排序:

iris.ba = iris
iris.ba$Species = with(iris.ba, reorder(Species, Sepal.Width, mean))
Run Code Online (Sandbox Code Playgroud)

翻译成dplyr

iris.tr = iris %>% mutate(Species = reorder(Species, Sepal.Width, mean))
Run Code Online (Sandbox Code Playgroud)

之后,您可以继续按照问题进行总结和绘图。


几点评论:重新排序一个因素正在修改数据列。dplyr修改数据列的命令为mutate。所有arrange操作都是对行进行重新排序,这对因子的水平没有影响,因此对ggplot中图例或轴的顺序也没有影响。

所有因素都有其水平的顺序。ordered = TRUE因子和常规因子之间的差异在于如何在模型中建立对比。ordered = TRUE仅当您的因子水平具有有意义的等级顺序(例如“低”,“中”,“高”)时才使用,即使如此,也仅在构建模型且不希望将所有内容与参考水平。