2015-09-12 16 views
7

私はいくつかのを偶然見つけプロジェクトのためと偶然の瞬間にggplot2でいくつかの分析をやっているとの組み合わせで、AES()にドル記号表記で変数を渡すとき説明できない行動aes(x = cyl, ...)と書くと、プロットはaes(x = mtcars$cyl, ...)を使って同じ変数を渡すと、それとは違って見えます。 facet_grid(am ~ .)を削除すると、両方のグラフが再び同じになります。以下のコードは、同じ動作を生成し、私のプロジェクトでのコードの後に​​モデル化されています。ここでは問題奇妙な(私にとっては)facet_grid()またはfacet_wrap()

library(dplyr) 
library(ggplot2) 

data = mtcars 

test.data = data %>% 
    select(-hp) 


ggplot(test.data, aes(x = test.data$cyl, y = mpg)) + 
    geom_point() + 
    facet_grid(am ~ .) + 
    labs(title="graph 1 - dollar sign notation") 

ggplot(test.data, aes(x = cyl, y = mpg)) + 
    geom_point()+ 
    facet_grid(am ~ .) + 
    labs(title="graph 2 - no dollar sign notation") 

は、グラフ1の画像である:ここで graph 1 - dollar sign notation

はグラフ2の画像です: graph 2 - no dollar sign notation

は、私が代わりにaesaes_stringを使用して文字列として変数名を渡すこの問題を回避できることがわかったが、私はggplotがそのように動作している理由を理解したいと思います。この問題は同様の試みとしてfacet_wrapで発生します。事前に任意の助け

Thxをたくさん!私はきちんと...

+9

短い答えは:「決して* aes()」で '$'を使用していない – baptiste

+0

^_ ^私のグラフが突然奇妙に見える今日私が得た、私はもうやりません。それでも私はこの問題や行動を以前に経験したことがないので、何が起こっているのか理解したいと思います。 – Christoph

+1

ggplotがプロットを作成するときに、各レイヤーのデータセットをグループに分割します(美学とファセットによって定義されます)。このグループ化を信頼できるようにするには、単一のdata.frameからの変数が必要です。そうでないと、ggplotはファセットファクタと残りのマッピングの順序を変えることになります。 – baptiste

答えて

23

TLを理解していない場合、私は非常に不快に感じる; DR

決して使用[aes()内部$


面取り変数fすぐこれらの二つのプロットで何が起こるかを対比x

d <- data.frame(x=1:10, f=rev(letters[gl(2,5)])) 

に対して非自明ために意図的である場合、この例示的な例を検討

p1 <- ggplot(d) + 
    facet_grid(.~f, labeller = label_both) + 
    geom_text(aes(x, y=0, label=x, colour=f)) + 
    ggtitle("good mapping") 

p2 <- ggplot(d) + 
    facet_grid(.~f, labeller = label_both) + 
    geom_text(aes(d$x, y=0, label=x, colour=f)) + 
    ggtitle("$ corruption") 

​​

我々はggplotは、それぞれのdata.frameを作成するときにため、2番目のプロットは、間違ったマッピングを持っている

ggplot_build(p1)[["data"]][[1]][,c("x","PANEL")] 

    x PANEL 
1 6  1 
2 7  1 
3 8  1 
4 9  1 
5 10  1 
6 1  2 
7 2  2 
8 3  2 
9 4  2 
10 5  2 

ggplot_build(p2)[["data"]][[1]][,c("x", "PANEL")] 

    x PANEL 
1 1  1 
2 2  1 
3 3  1 
4 4  1 
5 5  1 
6 6  2 
7 7  2 
8 8  2 
9 9  2 
10 10  2 

、各パネルのggplot2が内部で作成されたdata.frameを見て、何が起こっているかの良いアイデアを得ることができますパネルでは、x値が「間違った」順序で選択されます。

$の使用は、様々な変数間のリンクは(ggplotはそれはそれは知っているすべては、任意の、切断のソースから来る可能性があるため、独立変数、だと仮定しなければならない)マッピングすることが壊れるので、これが発生しました。この例のdata.frameは因子fに従って順序付けされていないので、各パネルに対して内部的に使用されるサブセットdata.framesは間違った順序を仮定します。

+0

ありがとうございました!あなたの例は素晴らしいです! – Christoph