2

a を使用しfor loopて ggplots を a に割り当てlist、それをplot_grid()(package cowplot) に渡します。plot_grid複数の ggplot を 1 つの図に並べて配置します。これは手動で問題なく動作しますが、 を使用するfor loopと、最後に生成されたプロットが Figure の各サブフレームで繰り返されます (以下を参照)。つまり、すべてのサブフレームが同じ ggplot を示します。

おもちゃの例を次に示します。

require(cowplot)

dfrm <- data.frame(A=1:10, B=10:1)

v <- c("A","B")
dfmsize <- nrow(dfrm)
myplots <- vector("list",2)

count = 1
for(i in v){
    myplots[[count]] <- ggplot(dfrm, aes(x=1:dfmsize, y=dfrm[,i])) + geom_point() + labs(y=i)
    count = count +1
}
plot_grid(plotlist=myplots)

期待値:

ここに画像の説明を入力

からの図for loop:

ここに画像の説明を入力

この質問で説明されているように、次のようにリスト要素をグロブに変換してみました。

mygrobs <- lapply(myplots, ggplotGrob)
plot_grid(plotlist=mygrobs)

しかし、私は同じ結果を得ました。

問題は ではなくループ割り当てにあると思いますが、plot_grid()何が間違っているのかわかりません。

4

4 に答える 4

5

これまでの答えは非常に近いですが、私の意見では不十分です。問題は次のとおりです-forループの後:

myplots[[1]]$mapping
#* x -> 1:dfmsize
#* y -> dfrm[, i]
myplots[[1]]$plot_env
#<environment: R_GlobalEnv>

myplots[[2]]$mapping
#* x -> 1:dfmsize
#* y -> dfrm[, i]
myplots[[2]]$plot_env
#<environment: R_GlobalEnv>

i
#[1] "B"

他の回答が言及しているように、ggplot実際にはプロットするまでこれらの式を評価しません。これらはすべてグローバル環境にあり、の値はiis"B"であるため、望ましくない結果が得られます。

この問題を回避するにはいくつかの方法がありますが、最も簡単な方法は実際に式を簡素化します。

myplots = lapply(v, function(col)
            ggplot(dfrm, aes(x=1:dfmsize, y=dfrm[,col])) + geom_point() + labs(y=col))

これが機能する理由は、ループ内の値ごとに環境が異なるためです。lapply

myplots[[1]]$mapping
#* x -> 1:dfmsize
#* y -> dfrm[, col]
myplots[[1]]$plot_env
#<environment: 0x000000000bc27b58>

myplots[[2]]$mapping
#* x -> 1:dfmsize
#* y -> dfrm[, col]
myplots[[2]]$plot_env
#<environment: 0x000000000af2ef40>

eval(quote(dfrm[, col]), env = myplots[[1]]$plot_env)
#[1]  1  2  3  4  5  6  7  8  9 10
eval(quote(dfrm[, col]), env = myplots[[2]]$plot_env)
#[1] 10  9  8  7  6  5  4  3  2  1

だから表現は同じでも結果は違う。

そして、正確に何を環境に保存/コピーするのか疑問に思っている場合は、lapply当然のことながら、それは単なる列名です:

ls(myplots[[1]]$plot_env)
#[1] "col"
于 2016-09-30T22:18:23.017 に答える
3

[この回答]( https://stackoverflow.com/a/26246791/2461552 .

私は通常、このような状況に切り替えるaes_stringaes_、このような状況に切り替えて、ggplot2 で変数を文字列として使用できるようにします。

リストの初期化とカウンターの使用を回避できるためlapply、ループはループよりも簡単だと思います。for

まず、x 変数をデータセットに追加します。

dfrm$index = 1:nrow(dfrm)

さて、lapplyループ、 の列をループしますv

myplots = lapply(v, function(x) {
    ggplot(dfrm, aes_string(x = "index", y = x)) + 
        geom_point() +
        labs(y = x)
})

plot_grid(plotlist = myplots)
于 2016-09-30T21:14:25.693 に答える
3

ここでの問題は、メソッドの非標準評価により、プロットが実際にプロットされるまでaes評価が遅れることだと思います。iプロットの時点で、iは最後の値 (おもちゃの例では "B") であるため、yすべてのプロットの美的マッピングはその最後の値を参照します。一方、呼び出しは標準評価を使用するため、ラベルはループ内のlabs各反復を正しく参照します。i

これは、マッピング関数の標準評価版を使用するだけで修正できますaes_q

require(cowplot)

dfrm <- data.frame(A=1:10, B=10:1)

v <- c("A","B")
dfmsize <- nrow(dfrm)
myplots <- vector("list",2)

count = 1
for(i in v){
    myplots[[count]] <- ggplot(dfrm, aes_q(x=1:dfmsize, y=dfrm[,i])) + geom_point() + labs(y=i)
    count = count +1
}
plot_grid(plotlist=myplots)
于 2016-09-30T21:22:22.787 に答える
2

実際にそれらをその場で定義しているにもかかわらず、内部であなたと変数ggplotを探すことで混乱していると思います。ループを少し変更して、最初の行として新しいサブを作成すると、問題なく動作します。xydfrmfordata.frame

myplots <- list()
count = 1

for(i in v){
    df <- data.frame(x = 1:dfmsize, y = dfrm[,i])
    myplots[[count]] <- ggplot(df, aes(x=x, y=y)) + geom_point() + labs(y=i)
    count = count + 1
}
plot_grid(plotlist=myplots)

ここに画像の説明を入力

于 2016-09-30T21:07:29.153 に答える