65

私はggplotを使用facet_wrapして、次のように物事をプロットしています。facet_grid

ggplot(iris) + geom_histogram(aes(iris$Petal.Width)) + facet_grid(Species ~ .)

Speciesプロットでパネルが並べられる順序を制御することは可能ですか?irisこれは、データフレームを変更したり、新しいデータフレームを作成したりせずに実行できますか?ここでのデフォルトはsetosa、versicolor、virginicaを示していますが、別の順序でお願いします。ありがとう。

4

1 に答える 1

64

「新しいデータフレームを作成せずに」という要件を実際に満たすことはできないと思いますが、新しいデータフレームをその場で作成することはできます。

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の関数は、データセット内の行の順序ではなく、因子レベルの順序に基づいています。上記の答えは、より一般的に適用されます。

于 2013-02-27T15:50:53.690 に答える