2016-07-01 8 views
1

私のデータフレーム内のすべての変数に対してボックスプロットを生成したいと思います。しかし、問題は、lapply経由でループしている変数名でx軸にラベルを付けることができないということです。何かご意見は。ボックスプロットのためのプロット内のlapply関数内の要素の名前にアクセスする方法

df=data.frame(a=rnorm(100), b=rnorm(100), c=rnorm(100), d=rep(1:2,50)) # data 
df$d=as.factor(df$d) 

機能

Boxplotfun=function(x,i){ 
    if(is.numeric(x)) { 
    p <- ggplot(df, aes(d, x, group=d)) + geom_boxplot(outlier.colour = "red", fill = c("gold","darkgreen")) + coord_flip() + theme_light() + ggtitle(paste(names(x))) 
    plot(p) 
    } 
} 

l=lapply(df[-ncol(df)], Boxplotfun) 
+5

私は 'mapplyを使用するために使用されます'のために問題のタイプです。 'mapply(myfun、x = df、title = names(df))'のようなものは、myfunがtitle引数を取ることを確認します。今度は 'tidyr :: gather'を使ってdfを2列のdf(変数、値)にしてから' facet_wrap(〜variable) 'を使用します。 –

+0

@RichardTelford:これは動作しません。 myfunにttitle用のparamを追加しましたが、まだxを表示しています。 –

答えて

2

だけ答えにリチャードさんのコメントを作るために:

df <- data.frame(a=rnorm(100), b=rnorm(100), c=rnorm(100), d=rep(1:2,50)) # data 
df$d <- as.factor(df$d) 

df2 <- tidyr::gather(df, 'var', 'val', -d) 
ggplot(df2, aes(d, val, fill = d)) + 
    geom_boxplot(outlier.colour = "red") + 
    scale_fill_manual(values = c("gold","darkgreen")) + 
    coord_flip() + 
    theme_light() + 
    facet_grid(var~.) 
代わりに、最初の引数がlapplyするとしてデータフレームを使用しての

enter image description here

+0

解決策のために変数が同じスケールで比較できない場合、これは実現不可能です。あなたはmapplyを使って解決策を与えることができますか? –

+0

'facet_grid(var〜。、scales = 'free')'を使用してください。 – Axeman

+0

@Thanksは完璧です。 –

1

、データフレームの名前を直接使用して、自分のデータを参照することができますあなたのプロット関数の内側にある。

代わりにAESを使用しての私は、「X」の内側とggplot私は変数xのためではなく、名前が「X」

Boxplotfun=function(x) { 
    if(is.numeric(df[, x])) { 
    p <- ggplot(df, aes_string("d", x, group="d")) + 
     geom_boxplot(outlier.colour = "red", fill = c("gold","darkgreen")) + 
     coord_flip() + theme_light() + 
     ggtitle(x) 
    plot(p) 
    } 
} 

ll <- lapply(names(df[-ncol(df)]), Boxplotfun) 
を参照する変数を捜しているわけではないことを理解して渡すことができるように、私はaes_stringをも使用しています

編集: 凡例を表示したい場合はAxemanの答えが示されているように、あなたは、すべきで、あなたのAESの内側に記入し、色を選択するscale_fill_manualを使用して指定します。

Boxplotfun=function(x) { 
    if(is.numeric(df[, x])) { 
    p <- ggplot(df, aes_string("d", x, fill="d")) + 
     geom_boxplot(outlier.colour = "red")+ 
     scale_fill_manual(values = c("gold","darkgreen")) + 
     coord_flip() + theme_light() + 
     ggtitle(x) 
    plot(p) 
    } 
} 
+0

@ありがとうChoubi私はこれを試してみる –

関連する問題