Добавление разных сегментов в ggplot цикла

#r #ggplot2

#r #ggplot2

Вопрос:

Я пытаюсь создать 4 графика с n разными сегментами и точками на каждом, например, скажем, я хочу иметь n = 10

 library(gridExtra)
sim.beta=function(a,b,sig,n){
  x=runif(n,1,10)
  y=a b*x rnorm(n,0,sig)  
  return(data.frame(x,y))
}

a=10; b=5;sig=20;n=10

grafico=list()
for (i in 1:4) {
  s1=sim.beta(a,b,sig,n)
  X=s1$x;Y=s1$y
  z=qnorm(0.975)
  g=ggplot(s1,aes(x,y)) 
    xlim(0,10) 
    ylim(a-z*sig,a b*10 z*sig)
  g=g geom_abline(intercept = a,slope = b,col=2)
  mod1=lm(s1$y~s1$x)
  for (j in 1:n) {
    r11=X[j];r21=a b*r11
    g=g  geom_segment(aes(x=r11,y=r21 z*sig,xend=r11,yend=r21-z*sig),linetype=2)
    g=g geom_point(aes(x[j],y[j]),col=4)
  }
  g=g geom_abline(aes(intercept=mod1$coefficients[1],slope=mod1$coefficients[2]),col=4,linetype=2)
  grafico[[i]]=ggplotGrob(g)
}

grid.arrange(grobs=grafico, ncol=2,nrow=2) 
  

И это то, что я получаю:
сюжет

Обратите внимание, что я получаю только 1 сегмент и 1 точку, но я хочу иметь 10, как это с функцией plot:

plo2 ( пло2 )

Ответ №1:

Вы сталкиваетесь с тем фактом, что сопоставления для слоев вычисляются лениво. Это означает, что значение переменной, используемой в цикле, фактически не вычисляется до тех пор, пока не будет отрисован график, а не во время создания слоя. Пользователь может использовать rlang функции для ввода текущего значения в слой. Часть, которую вам нужно изменить, находится здесь

   for (j in 1:n) {
    r11=X[j]; r21=a b*r11
    g = g   geom_segment(aes(x=!!r11, y=!!r21 z*sig, xend=!!r11, yend=!!r21-z*sig), linetype=2)
    g = g   geom_point(aes(x[!!j], y[!!j]), col=4)
  }
  

Обратите внимание на добавление !! перед вашими переменными цикла. Это фиксирует их текущие значения.