2017-08-01 8 views
0

ループが繰り返されるたびに新しいplotxが作成されます。これは、私が別のグラフを生成するprint(plotx)を実行するときにうまく動作します。割り当てループがプロットで機能しない

私はそれぞれのプロット「plotx1」、「plotx2」などを呼び出すためにassignを使用して、各プロットを別々の名前として保存しました。 名前プロットをプロットすると、それらはすべてY = cと同じですが、y軸はループの元のYで正しくラベル付けされています!どうしたの? これを修正するにはどうすればよいですか?

dat = data.frame("d"= rep(c("bla1","bla2","bla3"),3),"a" = c(1:9), "b"= 
c(19:11), "c"=rep(c(3,2,2),3)) 

X = "d" 
listY = c("a","b","c") 
z= 0 
for (Y in listY){ 
    z= z+1 
plotx= ggplot(dat, 
    aes(x = dat[[X]], y = dat[[Y]])) + 
    geom_boxplot() + 
    scale_x_discrete(X) + 
    scale_y_continuous(Y)+ 
    theme_bw() 
print(plotx) 

plot_name = paste0("plotx",z) 
assign(plot_name , plotx) 
    } 
plotx1 
plotx2 
plotx3 
+2

を使用してそれらをプロットすることができます。ループの後、 'Y'の値は' listY'の最後の値です。いくつかのオプションがあります: 'dat [[Y]]'を使うか、ggplotオブジェクトをgrobに変えることができます。 – Roland

+0

これはループの外で同じプロットを取得する正しい理由です。 – Sal

答えて

1

@Rolandによってこの現象が説明されています。あとでアクセスする場合は、リストを使用してプロットを保存する必要があります。また、xyの文字列を渡す場合は、aesの代わりにaes_stringを使用する必要があります。ここでは作業コードは次のとおりです。

dat = data.frame("d"= rep(c("bla1","bla2","bla3"),3),"a" = c(1:9), "b"= 
        c(19:11), "c"=rep(c(3,2,2),3)) 

X = "d" 
listY = c("a","b","c") 
z= 0 
plots <- list() 
for (Y in listY){ 
    z= z+1 

    plotx <- ggplot(dat, 
       aes_string(x = dat[[X]], y = dat[[Y]])) + 
       geom_boxplot() + 
       scale_x_discrete(X) + 
       scale_y_continuous(Y)+ 
       theme_bw() 
    plot_name <- paste0("plotx",z) 
    plots[[plot_name]] <- plotx 

} 

次に、あなたが個別にあなたがそれを印刷するとき、プロットは新しい構成されplots["plotx1"]

+0

申し訳ありませんが、これは新しい質問ですが、どのようにプロットをカウプロットに呼びますか?私はplot.grid(plotots [1]、plots [2])を実行しようとするとプロットとして認識されません – Birdonawire

+0

plot_grid(plotlist = plots)を使用する必要がありました – Birdonawire

+0

'aes_string'はそうしません'dat [[X]]'のようなコーディングが必要ですが、変数を直接参照することができます。だからこの場合、 'aes_string(x = X、y = Y)'のように見えます。 – aosmith

関連する問題