首页 > 解决方案 > 在循环ggplot中添加不同的段

问题描述

我正在尝试制作 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

标签: rggplot2

解决方案


您遇到了这样一个事实,即层的映射被延迟评估。这意味着循环中使用的变量的值实际上在绘制绘图之前不会计算,而不是在创建图层时计算。使用可以使用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)
  }

注意在!!循环变量之前添加。这将捕获它们的当前值。


推荐阅读