(非常新手,所以请原谅任何混淆/明显的错误)
目标:一个循环,允许我绘制多个地图,显示网格单元格的密度数据(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)
}
问题:即使print(p)
为每次迭代生成正确的图,但列表out
中的图仅显示最终循环中的数据。
因此,当我尝试在“out”中使用grid.arrange
时,所有图表都显示相同的数据(来自第8列);但是,这些图确实保留了正确的标题。当我试图调出每个情节时 - 例如print(out[[1]])
,将相同的情节 - 标题标签除外 - 显示为print(out[[8]])
。
似乎列表中的前面元素被每个循环覆盖了吗?但是,图表的标题似乎正确显示。
我是如何构建out
列表的?如何避免每个以前的图被覆盖?
答案 0 :(得分: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]])
围绕这个(@baptiste也提到)的一种方法是使用aes_string()
。这样可以更快地解决变量&#34;所以这应该有用
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]])
这与aes()
功能最直接相关,因此您设置标题的方式很好,这就是您看到不同标题的原因。