「新しいデータフレームを作成せずに」という要件を実際に満たすことはできないと思いますが、新しいデータフレームをその場で作成することはできます。
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)データセット内の行の順序は、(2)因子のレベルの順序とは無関係であることに注意してください。#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の関数は、データセット内の行の順序ではなく、因子レベルの順序に基づいています。上記の答えは、より一般的に適用されます。