(非常新手,所以请原谅我的困惑/明显的错误)
目标:一个循环,它允许我绘制多个地图,显示网格单元的密度数据(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)为每次迭代生成了正确的图,但list out中的图仅显示来自最终循环的数据。
因此,当我尝试对"out“中的图使用grid.arrange时,所有的图都显示相同的数据(来自第8列);但是,这些图确实保留了正确的标题。当我尝试调用每个绘图时-例如,print(out[[1]]),显示相同的绘图-除了标题标签-作为print(out[[8]])。
列表中之前的元素似乎都被每个循环覆盖了?但是,绘图的标题似乎显示正确。
我构造out列表的方式有什么明显的错误吗?如何避免覆盖以前的每个绘图?
发布于 2014-05-03 11:09:23
问题不是每一项都被重写了,问题是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()。这会“更快”地解析变量的值,因此这应该是可行的
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()函数最直接相关,所以您设置标题的方式很好,这就是为什么您会看到不同的标题。
https://stackoverflow.com/questions/23439266
复制相似问题