使用for循环生成ggplots的网格

时间:2017-05-15 22:18:13

标签: r loops for-loop ggplot2

过去几天我遇到了这个问题。

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()的不同组合无济于事。

我在这里和网上看过类似的问题,但是找不到可行的解决方案。

感谢。

2 个答案:

答案 0 :(得分:2)

我建议采用不同的方法。将数据从长到长重新整形,然后使用构面。

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

答案 1 :(得分: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)    

希望这会有所帮助。