r - 在循环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 函数一样:
解决方案
您遇到了这样一个事实,即层的映射被延迟评估。这意味着循环中使用的变量的值实际上在绘制绘图之前不会计算,而不是在创建图层时计算。使用可以使用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)
}
注意在!!
循环变量之前添加。这将捕获它们的当前值。
推荐阅读
- performance - MarkLogic 副本林是否也将参与搜索查询
- python - 获取 pandas 分组 DataFrame 的列和组的值
- azure-functions - 写入 local.settings.json Azure Functions
- python - 如何使用 pandas styler 对象的 .head() 方法?
- css - 从百分比中减去时 CSS calc 不起作用 [Opera]
- c# - 使用 ScrollViewer UWP 的 ViewChange 事件时如何确定滚动方向(底部或顶部)
- microsoft-graph-api - 使用应用程序将消息发布到 Microsoft Teams 频道
- puppet - 更改时在 docker::run 块之前运行 exec
- java - 没有可用的消息 MVC
- mongoose - ESP8266 Mongoose OS,无法向 Google Cloud IoT 推送/接收数据