首页 > 解决方案 > for循环不创建多个ggplot对象

问题描述

我希望创建一个 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))
}

标签: rfor-loopggplot2

解决方案


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

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

稍后,您可以使用 ge new_list[[1]]等访问列表中的每个 ggplot-object。

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

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
}

推荐阅读