2013-02-27 70 views
21

ように私は、ggplotでfacet_wrapfacet_gridを使用して、物事をプロットしています:ggplot2でfacet_grid/facet_wrapの順序を制御していますか?

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

Speciesパネルがプロットに順序付けされる順序を制御することが可能ですか? irisデータフレームを変更したり新しいフレームワークを作成せずにこれを行うことはできますか?ここのデフォルトでは、setosa、versicolor、virginicaが表示されていますが、私は別の順序を望みます。ありがとう。

+1

多分facet_grid(factor、種、レベル= c( "virginica"、 "setosa"、 "versicolor"))〜) '? [oops、does not work] –

+1

ベンノートでは、ggplot(バープロット、ファセットなどのバー)の基本的なすべての順序を制御する方法は、因子を使用してレベルの順序を調整することです。 – joran

+0

...またはこれ:http://stackoverflow.com/q/3311901/324364 – joran

答えて

24

私は、私は本当にあなたの「新しいデータフレームを作成することなく、」要件を満たすことができますが、その場で新しいデータフレームを作成することができるとは思わない:

ggplot(transform(iris, 
     Species=factor(Species,levels=c("virginica","setosa","versicolor")))) + 
    geom_histogram(aes(Petal.Width))+ facet_grid(Species~.) 

私はそれがあればいいだろう同意(1)データで行がセットの順番は(の順序とは無関係であることを

注意が...そこにこれを制御する別の方法があったが、ggplotはすでにかなり強力な(そして複雑な)エンジンです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の関数は、データセットの行の順序ではなく、要素レベルの順序に基づいています。上記の回答がより一般的に適用されます。

+0

ここで 'transform'呼び出しが正確に何をしているのか説明できますか? Rに 'transform(iris、factor(Species、levels = c(" virginica "、" setosa "、" versicolor ")))'を入力すると、与えられた順番で 'Species'を持つデータフレームを出力しません'levels' – user248237dfsf

+0

' transform'呼び出しの 'Species ='部分を省いたと思います。 'transform' *は新しいデータフレームを生成しています。 –

+0

私はそれをミスタイプしました、申し訳ありません。 Rの中で、 'setosa、versicolor、' 'setosa''というデータフレームを出力します。私はここで変形がどのように働くのか分かりません。あなたのフルコールは私が望むグラフを生成しますが、なぜこの 'transform'コールが' levels'で指定された順序を与えないのか混乱しています。ありがとう – user248237dfsf

関連する問題