使用for循环生成ggplot图形网格

3

我已经被这个问题困扰了几天。

for(i in 1:10){
  nam <- paste("A", i, sep = "")
  p <- ggplot(data=PCdf8, aes(x = 1:nrow(PCdf8), y = PCdf8[,i])) +
    geom_line(colour = "#0072B2", size = 0.5) 
  assign(nam, p)
}

grid.arrange(A1, A2, A3, A4, A5, A6, A7, A9, A10)

我的代码输出了10次相同的图形(#10),而不是10个不同的图形。
我尝试将它们写入一个空列表,但是非grobs与grid.arrange()不兼容。我也尝试过删除非grobs。我最终将每个图形写入A1到A10的对象中。我还尝试删除每个循环结尾处的“nam”...尽管如此,似乎这个循环产生了10个对象,即A1到A10,都是相同的图形,这意味着循环中的最后一个图形令人恼火地被写入了所有对象中。
我想将其扩展到大约100个图形。因此,我想做类似于以下的事情:
grid.arrange(A1:A100)

我尝试使用不同的seq()和paste()组合,但都没有成功。
我在这里和网上看到过类似的问题,但是没有找到可行的解决方案。
谢谢。

1
在使用for循环时,您需要有一个索引的左侧。否则,在每次通过时都会覆盖值。 - IRTFM
如果ggplot对象在列表x中,您可以使用gridExtra::grid.arrange(grobs = x) - Richard Telford
2个回答

3
我建议采用不同的方法。将您的数据从宽格式转换为长格式,然后使用面板展示。
library(dplyr)
library(tidyr)
library(ggplot2)

# Example data frame
df1 <- as.data.frame(matrix(rnorm(100), ncol = 10, nrow = 10))
df1 %>% 
  mutate(x = 1:nrow(df1)) %>% 
  gather(var, val, -x) %>% 
  ggplot(aes(x, val)) + geom_line() + facet_wrap(~var, ncol = 5)

enter image description here


0

在这里,您需要在函数ggplot中将映射参数更改为aes_string()

for(i in 1:10){
nam <- paste("A", i, sep = "")
p <- ggplot(data=PCdf8, mapping = aes_string(x = 1:nrow(PCdf8), y = PCdf8[,i])) +geom_line(colour = "#0072B2", size = 0.5) 
assign(nam, p)
}
grid.arrange(A1, A2, A3, A4, A5, A6, A7, A9, A10)    

希望这能帮到你。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接