【问题标题】:Use for loop in ggplot2 to generate a list在ggplot2中使用for循环生成列表
【发布时间】:2016-04-23 16:15:37
【问题描述】:

我想使用for loop 生成ggplots 的列表。

sig_snp<-c("rs644045_A","rs12997044_C","rs17739727_A")

p_re<-list() 

for ( i in sig_snp){
 test %>% dplyr::select(i,type,micro1) %>%
 ggplot(aes(factor(type),log(micor1) )) + 
 geom_boxplot(aes(fill = factor(i)))+
 xlab('')+ylab('log abundance')->p_re[[i]]
}

错误如下:

错误:所有 select() 输入必须解析为整数列位置。 以下不: * 我

我以这种方式测试了 for 循环中的每个i

   test %>% dplyr::select(rs644045_A,type,micro1) %>%
   ggplot(aes(factor(type),log(micor1) )) + 
   geom_boxplot(aes(fill = factor(rs644045_A)))+
   xlab('')+ylab('log abundance')

它单独工作,但为什么不能循环工作?

【问题讨论】:

  • test 在哪里?请展示一个可重现的例子
  • 我以为是语法问题:如何使for循环中的i被识别为不带引号的原始名称?当我在 for 循环中测试每个 i 时,它单独工作。
  • 尝试使用 select_ 而不是 select
  • @GeorgeDontas 是的,select_dplyr 中完全有效,但iggplot 的循环中仍然未被识别为原始名称:.... ...fill = factor(i).........

标签: r ggplot2 dplyr


【解决方案1】:

棘手的部分是select_get()

get() 的答案来自这里:Remove quotes from a character vector in R

但是,就我而言,它在循环中不起作用。我认为这可能是由于我的代码中的双循环(我不确定)。

无论如何,还有另一种方法可以做到:

 test[,c(sig_snp,"type","micro1")]%>%
    melt(id=c("type","micro1"))%>% # head()
    ggplot(aes(factor(type),log(micro1) )) + 
    geom_boxplot(aes(fill = factor(value)))+
    xlab('')+ylab('log abundance')+facet_grid(.~variable)

我从这里Looping over variables in ggplot得到这个想法

【讨论】:

    【解决方案2】:

    如果您需要将每个 SNP 的 ggplot 输出保留在列表中,最好使用 lapply 输出列表,例如:

    library(ggplot2)
    
    #dummy data
    test <- mtcars
    
    #significant SNPs
    sig_snp <- c("mpg", "cyl", "disp")
    
    #create list of ggplots per SNP
    p_re <-
      lapply(sig_snp, function(i){
    
        ggplot(test, aes_string("qsec", i)) +
          geom_point()
    
        })
    
    #assign names
    names(p_re) <- sig_snp
    
    #plot
    p_re$mpg
    

    【讨论】:

      猜你喜欢
      • 2013-12-16
      • 1970-01-01
      • 2021-11-16
      • 2020-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-07
      相关资源
      最近更新 更多