gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:04:21 27 4
gpt4 key购买 nike

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

目标:一个允许我绘制多个 map 的循环,显示网格单元格的密度数据 (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 的方式有什么明显的问题吗?列表?如何避免覆盖之前的每个图?

最佳答案

问题不是每个项目都被覆盖了,问题是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() 最直接相关。功能,因此您设置标题的方式很好,这就是您看到不同标题的原因。

关于r - 循环中的多个绘图列表 (ggplot2) - 列表元素被覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23439266/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com