微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

R ggplot2 循环,用于为不同的行子集创建单独的输出

如何解决R ggplot2 循环,用于为不同的行子集创建单独的输出

而不是绘制所有数据行我只想绘制我真正感兴趣的行子集(子集在列表中先验定义)。也许这可以通过循环来完成。

示例:我有一个行数据框,其中包含我实验中所有基因在两个时间点(例如下面)的基因表达数据

library(tidyverse)
library(ggplot2)
library(ggforce) # for paginated plotting

#create a df of all genes and their expression at two time points
gene_expression <- data.frame(
  gene = as.character(c('a','a','b','c','d','e','f','g','h','i','j','j')),timepoint = as.character(c('1','1','2','2')),expression = as.numeric(sample(20:90,size = 60)))

#create a df of interesting genes
interesting_genes <- data.frame(
  tissue = as.character(c('heart','heart','kidney','liver','intestine','intestine')),gene = as.character(c('a','g')))

我可以使用下面的代码轻松绘制所有这些基因,但我只想绘制许多不同但已定义的行/基因子集

n_pages = 3

pdf(file=paste('all_genes.pdf'),width=10,height=7)

for (i in seq_len(n_pages)) {
      print(ggplot(gene_expression,aes(x=timepoint,y=expression,group=interaction(timepoint,gene ),fill = timepoint)) + # for grouping on multiple columns use "interaction" https://stackoverflow.com/questions/18598953/geom-line-connects-points-mapped-to-different-groups
              geom_Boxplot() +
              geom_point(position=position_jitterdodge(),aes(group=interaction(timepoint,gene)))+
              scale_x_discrete(limits=c("1","2")) +
              facet_wrap_paginate(~ gene,scales = "free",ncol = 2,nrow = 2,page = i)) # use "free" scales if you want y-axis free too.
    }
    
dev.off()

我可以通过过滤行/基因(见下文)手动绘制单个子集,但我更喜欢循环或映射来一个一个地绘制所有子集(此处为组织类型)。。 >

所需的输出是每个子集的 1 个 PDF 文件(即心脏、肾脏、肝脏、肠道各 1 个 PDF)以及与组织类型相关的基因子集。

如果每个 PDF 标题都与组织类型相对应,那就太好了。

heart_list <- as.vector(interesting_genes %>% filter(tissue == 'heart')%>% select('gene') %>% unlist())

pdf(file=paste('heart_genes.pdf'),height=7)
for (i in seq_len(n_pages)) {
  print(ggplot(gene_expression %>% filter(gene %in% heart_list ),fill = timepoint)) + # for grouping on multiple columns use "interaction" https://stackoverflow.com/questions/18598953/geom-line-connects-points-mapped-to-different-groups
          geom_Boxplot() +
          geom_point(position=position_jitterdodge(),gene)))+
          scale_x_discrete(limits=c("1","2")) +
          facet_wrap_paginate(~ gene,page = i)) # use "free" scales if you want y-axis free too.
}

任何帮助将不胜感激。如果有人有比 facet_wrap_paginate 更好的建议(例如 cowplot 或类似的),也请告诉我。 提前致谢

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。