for循环未创建多个ggplot对象

时间:2019-09-12 09:15:33

标签: r for-loop ggplot2

我希望创建一个ggplot函数,该函数循环遍历对象列表,并创建单个ggplot对象。下面的代码成功打印出列表中的最后一个图,但是没有任何内容保存为对象。

在此先感谢您的帮助!

negbinom_list <- c("cytoxic_CD4_CD8.wt.negbinom", "helper_CD4.wt.negbinom")


VolPlot <- function(data, title){

highlight_df <- data %>% filter(p_val_adj<=0.05) %>% filter(avg_logFC<=-0.5 | avg_logFC>=0.5)
data$ID <- row.names(data)
label_df <- filter(data, ID %in% GOI)
data$ID <- row.names(data)
VolPlot_name <- paste( 'volplot', title, sep = '.' )
VolPlot_name <- ggplot(data=data, 
            aes(x=avg_logFC, y =-log10(p_val_adj))) +
  geom_point(alpha=0.4, size=1.75) +
  xlim(c(-2, 2)) +
  xlab("log2 fold change") + ylab("-log10 adjusted p value") +
  theme_bw() +
  theme(legend.position="none") +
  geom_point(data=highlight_df, aes(x=avg_logFC, y =-log10(p_val_adj)), color='red', alpha=0.4,size=1.75) +
  geom_text(aes(label=ifelse(avg_logFC<=-0.75 | avg_logFC>=0.75,as.character(ID),'')),hjust=0,vjust=0) +
  geom_label_repel(data = label_df, aes(label = ID), nudge_y = 36, nudge_x = 1, direction = "x")
}
for(i in negbinom_list){
  print(VolPlot(get(i), i))
}

1 个答案:

答案 0 :(得分:2)

如果您打算将每个ggplot对象保存到一个变量中,最好在函数的末尾使用 return(list(VolPlot_name))返回列表中的每个ggplot对象强>。仅返回对象最终仅包含列表内的数据框。

通过这种方式,您可以在函数外部创建列表。在遍历变量 negbinom_list 时,可以将每个结果添加到新列表中。

稍后,您可以使用g访问列表中的每个ggplot对象。 new_list [[1]] ,等等。

让我知道它是否对您有用。

negbinom_list <- c("cytoxic_CD4_CD8.wt.negbinom", "helper_CD4.wt.negbinom")


VolPlot <- function(data, title){

highlight_df <- data %>% filter(p_val_adj<=0.05) %>% filter(avg_logFC<=-0.5 | avg_logFC>=0.5)
data$ID <- row.names(data)
label_df <- filter(data, ID %in% GOI)
data$ID <- row.names(data)
VolPlot_name <- paste( 'volplot', title, sep = '.' )
VolPlot_name <- ggplot(data=data, 
            aes(x=avg_logFC, y =-log10(p_val_adj))) +
  geom_point(alpha=0.4, size=1.75) +
  xlim(c(-2, 2)) +
  xlab("log2 fold change") + ylab("-log10 adjusted p value") +
  theme_bw() +
  theme(legend.position="none") +
  geom_point(data=highlight_df, aes(x=avg_logFC, y =-log10(p_val_adj)), color='red', alpha=0.4,size=1.75) +
  geom_text(aes(label=ifelse(avg_logFC<=-0.75 | avg_logFC>=0.75,as.character(ID),'')),hjust=0,vjust=0) +
  geom_label_repel(data = label_df, aes(label = ID), nudge_y = 36, nudge_x = 1, direction = "x")

return(list(VolPlot_name))
}

list_plots <- list()
count = 1
for(i in negbinom_list){
  list_plots[count] <- VolPlot(get(i), i)
  count = count + 1
}