我正在尝试构建一个ggplot图形列表,稍后将绘制该列表。到目前为止,我以Anscombe的四重奏为例,是:
library(ggplot2)
library(gridExtra)
base <- ggplot() + xlim(4,19)
plots = vector(mode = "list", length = 4)
for(i in 1:4) {
x <- anscombe[,i]
y <- anscombe[,i+4]
p <- geom_point(aes(x,y),colour="blue")
q <- geom_smooth(aes(x,y),method="lm",colour="red",fullrange=T)
plots[[i]] <- base+p+q
}
grid.arrange(grobs = plots,ncol=2)
当我遍历循环时,我希望将图p和q的当前值与基本图相加到列表的第i个值中。也就是说,列表元素编号i包含与数据集中第i个x和y列相关的图。
然而,发生的情况是最后一个图只被绘制了四次。我用base R做了一些非常类似的事情,使用了mfrow
、plot
和abline
,所以我相信我的逻辑是正确的,但我的实现不正确。我怀疑问题出在下面这几行代码上:
plots = vector(mode = "list", length = 4)
plots[[i]] <- base+p+q
如何创建一个ggplot图形列表;从一个空列表开始?
(如果这是一个琐碎而愚蠢的问题,我道歉。我对R和图形语法都是新手。)
发布于 2021-08-03 00:43:07
如果使用lapply()
而不是for循环,则代码可以正常工作。
plots <- lapply(1:4, function(i) {
# create plot number i
})
这个问题的原因是ggplot使用了惰性计算。在渲染绘图时,循环已经迭代到i=4
,最后一个绘图将显示四次。
完整的工作示例:
library(ggplot2)
library(gridExtra)
base <- ggplot() + xlim(4,19)
plots <- lapply(1:4, function(i) {
x <- anscombe[,i]
y <- anscombe[,i+4]
p <- geom_point(aes(x,y),colour="blue")
q <- geom_smooth(aes(x,y),method="lm",colour="red",fullrange=T)
base+p+q
})
grid.arrange(grobs = plots,ncol=2)
发布于 2021-08-03 01:12:37
要强制求值,有一个简单的解决方案,将aes(...)
更改为aes_(...)
,您的代码就可以正常工作。
library(ggplot2)
library(gridExtra)
base <- ggplot() + xlim(4,19)
plots <- lapply(1:4, function(i) {
x <- anscombe[,i]
y <- anscombe[,i+4]
p <- geom_point(aes_(x,y),colour="blue")
q <- geom_smooth(aes_(x,y),method="lm",colour="red",fullrange=T)
base+p+q
})
grid.arrange(grobs = plots,ncol=2)
https://stackoverflow.com/questions/68632779
复制相似问题