首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自循环的多个图的列表(ggplot2) -列出被覆盖的元素

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

Stack Overflow用户
提问于 2014-05-03 09:32:14
回答 1查看 4.3K关注 0票数 4

(非常新手,所以请原谅我的困惑/明显的错误)

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

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

代码语言:javascript
复制
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列表的方式有什么明显的错误吗?如何避免覆盖以前的每个绘图?

EN

回答 1

Stack Overflow用户

发布于 2014-05-03 11:09:23

问题不是每一项都被重写了,问题是ggplot()一直等到您打印出图才解析aes()命令中的变量。该循环将所有fill=参数分配给D。并且D的值在每个循环中都会发生变化。但是,在循环结束时,D将只有最后一个值。因此,列表中的每个绘图都将使用相同的颜色打印。

这也会重现同样的问题。

代码语言:javascript
复制
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()。这会“更快”地解析变量的值,因此这应该是可行的

代码语言:javascript
复制
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()函数最直接相关,所以您设置标题的方式很好,这就是为什么您会看到不同的标题。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23439266

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档