r - 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))
}
解决方案
如果您打算将每个 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
}
推荐阅读
- julia - 在 GPU 上使用 DiffEqFlux 反向传播神经 ODE 期间的标量运算
- javascript - 从 Firestore 读取不返回任何内容
- sql - 从表中删除额外的匹配项
- python-3.x - Agg 和 groupby 按特定条件
- linux - 如何在 tsv 文件列表(数百个)中查找单词列表(以千为单位),输出为每个文件中每个字符串的匹配数,在 linux 中?
- javascript - 如何根据范围滑块更改图像?
- node.js - 如何从没有外部 smtp 服务器的云服务器使用 Node.js 发送电子邮件?
- ios - 从 iOS 快捷方式中的字典中提取特定值以显示在从列表中选择菜单中?
- ruby-on-rails - rails 如何以及在何处为模型属性定义 getter 和 setter 方法
- python - ValueError:无法在 Django 外键中分配错误