在ggplot2中使用for循环生成列表

时间:2016-04-23 16:15:37

标签: r ggplot2 dplyr

我想使用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')

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

2 个答案:

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

答案 1 :(得分:0)

如果你需要在列表中保留每个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