【问题标题】:Using for loop to generate grid of ggplots使用 for 循环生成 ggplots 网格
【发布时间】:2017-05-15 22:18:13
【问题描述】:

过去几天我一直被这个问题困扰。

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() 不兼容。我也尝试过删除非格罗布。我求助于将每个情节写入对象 A1 到 A10。我还尝试在每个循环结束时删除“nam”......不过,似乎这个循环产生了 10 个对象,A1 到 A10,具有相同的情节,这意味着循环中的最后一个情节被令人恼火地写入所有对象。

我想将其扩展到大约 100 个地块。所以,我想做这样的事情:

grid.arrange(A1:A100)

我尝试使用 seq() 和 paste() 的不同组合,但无济于事。

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

谢谢。

【问题讨论】:

  • 在使用 for 循环时,您需要注意左侧有索引。否则,您会在每次传递期间覆盖这些值。
  • 如果ggplot对象在列表x中,可以使用gridExtra::grid.arrange(grobs = x)

标签: r loops for-loop ggplot2


【解决方案1】:

我建议采用不同的方法。将您的数据从宽调整为长,然后使用构面。

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)

【讨论】:

    【解决方案2】:

    这里需要在函数ggplot中将mapping参数改为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)    
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2021-04-26
      • 2014-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-29
      • 2012-01-21
      • 2013-12-16
      相关资源
      最近更新 更多