2017-09-26 14 views
0

3行4列のグリッドに12種類のプロットを描画しようとしています。しかし、それは最後のものを12回しかプロットしない。誰も私を助けることができますか?私はそれにうんざりしています。ありがとうggplotをリストに保存すると、同じグラフが表示されます

library(ggplot2) 
library(gridExtra) 

pmax=0.85 
K_min = 0.0017 
T = seq(100,1200,by=100) ## ISIs 
lambda =1/T 
p=list() 


for(i in (1:length(lambda))){ 
p[[i]]<-ggplot(data.frame(x = c(0, 1)), aes(x = x)) + 
stat_function(fun = function (x) (lambda[i]*(1-(1-pmax))/K_min)*(1-x)^((lambda[i]/K_min)-1)* 
            (1-(1-pmax)*x)^-((lambda[i]/K_min)+1),colour = "dodgerblue3")+ 
scale_x_continuous(name = "Probability") + 
scale_y_continuous(name = "Frequency") + theme_bw() 
main <- grid.arrange(grobs=p,ncol=4) 

} 

このコードは正しい画像を生成しますが、私の他の数字はggplotにあるので、ggplotを使用する必要があります。曲線を用い

par(mfrow = c(3, 4)) 
for (i in (1:length(lambda))){ 

    f <- function (x) ((lambda[i]*(1-(1-pmax))/K_min)*(1-x)^((lambda[i]/K_min)-1)* 
        (1-(1-pmax)*x)^-((lambda[i]/K_min)+1)) 
    curve(f,from=0, to=1, col = "violet",lwd=2,sub = paste0("ISI = ",round(1/lambda[i],3), ""),ylab="PDF",xlab="R") 
} 

正しいプロット:ループで作成

plot

答えて

2

ggplotオブジェクトは、ループの終わりに評価されます。この場合のすべてのggplotオブジェクトはlambda[i]で計算されたデータを使用するため、最後のiの値(12)に基づいて同じ結果が得られます。 2つの回避策が考えられます。

回避策1。リストへの保存&、それぞれがループ内グロブにオブジェクトggplot変換:

for(i in (1:length(lambda))){ 
    # code for generating each plot is unchanged 
    g <- ggplot(data.frame(x = c(0, 1)), aes(x = x)) + 
    stat_function(fun = function (x) (lambda[i]*(1-(1-pmax))/K_min)*(1-x)^((lambda[i]/K_min)-1)* 
        (1-(1-pmax)*x)^-((lambda[i]/K_min)+1),colour = "dodgerblue3")+ 
    scale_x_continuous(name = "Probability") + 
    scale_y_continuous(name = "Frequency") + theme_bw() 

    p[[i]] <- ggplotGrob(g) 
} 

main <- grid.arrange(grobs=p, ncol=4) 

workaround 1

回避策2. &ファセットを持つ単一のggplotを作成し、データフレーム内のすべてのデータを入れて各ISIについて:

library(dplyr) 

pmax = 0.85 
K_min = 0.0017 
ISI = seq(100, 1200, by = 100) # I changed this; using `T` as a name clashes with T from TRUE/FALSE 
lambda = 1/ISI 

df <- data.frame(
    x = rep(seq(0, 1, length.out = 101), length(ISI)), 
    ISI = rep(ISI, each = 101), 
    l = rep(lambda, each = 101) 
) %>% 
    mutate(y = (l * pmax/K_min) * (1-x)^((l/K_min) - 1) * 
      (1 - (1 - pmax) * x)^-((l/K_min) + 1)) 

ggplot(data, 
     aes(x = x, y = y, group = 1)) + 
    geom_line(colour = "dodgerblue3") + 
    facet_wrap(~ISI, nrow = 3, scales = "free_y") + 
    labs(x = "Probability", y = "Frequency") + 
    theme_bw() 

workaround 2

+0

グレート!助けてくれてありがとうございました。 –

関連する問題