【问题标题】:List for Multiple Plots from Loop (ggplot2) - List elements being overwrittenList for Multiple Plots from Loop (ggplot2) - 列出被覆盖的元素
【发布时间】:2014-05-03 01:32:14
【问题描述】:

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

目标:允许我绘制多个地图的循环,显示网格单元格的密度数据 (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 中的绘图仅显示来自最终循环的数据。

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

似乎列表中的先前元素正在被每个循环覆盖?但是,绘图的标题似乎正确显示。

我构建out 列表的方式有明显的问题吗?如何避免覆盖之前的每个情节?

【问题讨论】:

  • 你试过没有out[[i]]&lt;- pprint(p),没有分配p吗?
  • 您应该使用aes_string,但我认为更好的方法是将melt() 数据从宽格式转换为长格式。

标签: r ggplot2


【解决方案1】:

问题不在于每个项目都被覆盖,问题在于ggplot() 一直等到您打印绘图以解析aes() 命令中的变量。循环将所有fill= 参数分配给DD 的值会改变每个循环。但是,在循环结束时,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() 函数最直接相关,因此您设置标题的方式很好,这就是您看到不同标题的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    • 1970-01-01
    • 2011-10-19
    • 2020-08-28
    相关资源
    最近更新 更多