循环的多个图表列表(ggplot2) - 列出被覆盖的元素

use*_*066 3 r ggplot2

(非常新手,所以请原谅任何混乱/明显的错误)

目标:一个循环,允许我绘制多个地图,显示D网格单元格的密度数据(),跨越多个月和季节.每个月,季节等的数据分为8个单独的列; 循环将遍历数据框的列(DF)

尝试:将循环的每次迭代中的绘图添加到列表中,以便可以调用所有绘图以在多面板图中显示.

out <- NULL
 for(i in 1:8){

  D <- DF[,i]
  x <- names(DF)[i]

  p <-ggplot() + geom_polygon(data=DF, aes(x=long, y=lat, group=Name, fill=D), colour    = "lightgrey") +labs(title=x)

out[[i]]<- p

print(p)

}
Run Code Online (Sandbox Code Playgroud)

问题:即使print(p)为每次迭代产生正确的图,但列表中的图out仅显示最终循环中的数据.

因此,当我尝试使用grid.arrange"out"中的图时,所有图表都显示相同的数据(来自第8列); 但是,这些图确实保留了正确的标题.当我试图调出每个情节时 - 例如,print(out[[1]])显示相同的情节 - 除了标题标签 - 如print(out[[8]]).

似乎列表中的前一个元素被每个循环覆盖了吗?但是,图表的标题似乎正确显示.

我如何构建out列表有什么明显的错误吗?如何避免每个以前的图被覆盖?

MrF*_*ick 9

问题不在于每个项目都被覆盖,问题是ggplot()等到你打印绘图来解析aes()命令中的变量.循环将所有fill=参数分配给D.并且D每个循环的变化值.但是,在循环结束时,D只会有最后一个值.因此,列表中的每个图将以相同的颜色打印.

这也重现了同样的问题

require(ggplot2)

#sample data
dd<-data.frame(x=1:10, y=runif(10), g1=sample(letters[1:2], 10, replace=T), g2=sample(letters[3:4], 10, replace=T))

plots<-list()
g<-dd$g1
plots[[1]]<-ggplot(data=dd, aes(x=x, y=y, color=g)) + geom_point()

g<-dd$g2
plots[[2]]<-ggplot(data=dd, aes(x=x, y=y, color=g)) + geom_point()

#both will print with the same groups.
print(plots[[1]])
print(plots[[2]])
Run Code Online (Sandbox Code Playgroud)

解决这个问题的方法(@baptiste也提到过)就是使用aes_string().这样可以"更快地"解决变量的值.所以这应该有效

plots<-list()
g<-"g1"
plots[[1]]<-ggplot(data=dd, aes(x=x, y=y)) + geom_point(aes_string(color=g))
g<-"g2"
plots[[2]]<-ggplot(data=dd, aes(x=x, y=y)) + geom_point(aes_string(color=g))

#different groupings (as desired)
print(plots[[1]])
print(plots[[2]])
Run Code Online (Sandbox Code Playgroud)

这与aes()函数最直接相关,因此您设置标题的方式很好,这就是您看到不同标题的原因.