L oop через список графиков выходных данных - PullRequest
1 голос
/ 06 февраля 2020

Я пытаюсь сделать функциональные графики или мои лучшие 20 генов. Вот почему я создал список фреймов данных, эти фреймы данных существуют или разные столбцы содержат значения и имена. Одним из этих столбцов во фрейме данных является генный столбец. Мой код превращает первые 20 генов в графики функций. Но теперь у меня есть проблема в некоторых фреймах данных, которые существуют менее чем в 20 генах. Это приводит к тому, что мой код прерывается.

Поскольку я хочу максимум 5 функциональных графиков на странице, я не могу просто определить счетчик.

Спасибо за ввод.

Пример моего списка или фреймов данных listGroups

group1_2: 'data.frame': 68 obs. of 7 variables:
    ..$ p_val: num [1:68] 1.15 1.43 ...
    ..$ score: num [1:68] 15.5 27.14 ...
    ..$ gene: Factor w/ 68 levels "BRA1", "NED",...: 41 52 ...
group2_3: 'data.frame': 3 obs. of 7 variables:
    ..$ p_val: num [1:3] 1.15 1.43 ...
    ..$ score: num [1:3] 15.5 27.14 ...
    ..$ gene: Factor w/ 3 levels "BCL12", "DEF1",...: 41 52 ...

Код

groupNames <- c("cluster1_2","cluster2_3","cluster3_4","cluster4_5","cluster5_6")
for (i in 1:length(listGroups)) {
  Grouplist <- listGroups[[i]]
  genesList <- Grouplist['gene']
  lengths(geneList)
  print(groupNames[i])
  # Make Featureplots for top20 DE genes per cluster_group
  pdf(file=paste0(sampleFolder,"/Featureplots_cluster_",groupNames[i],"_",sampleName,".pdf"))
  print(FeaturePlot(object = seuratObj, features = c(as.character(genesList[1:5,]))))
  print(FeaturePlot(object = seuratObj, features = c(as.character(genesList[6:10,]))))
  print(FeaturePlot(object = seuratObj, features = c(as.character(genesList[11:15,]))))
  print(FeaturePlot(object = seuratObj, features = c(as.character(genesList[16:20,]))))
  dev.off()
}

Ответы [ 3 ]

2 голосов
/ 06 февраля 2020

Для каждого genelist вы можете составить один график с вашим выбором генов, таких как этот (график будет выглядеть хорошо с большим размером, как в вашем PDF):

  • используйте combine=FALSE и ограничьте число функций, чтобы построить что-то вроде rownames(pbmc_small)[1 : min(20, nrow(pbmc_small))], чтобы избежать ошибок
  • , затем экспортируйте список отдельных сюжетов (допускает создание тем) и нанесите их в pdf, используя cowplot::plot_grid
  • вместо построения в функция (plot(out)), вы можете экспортировать в pdf (возможно, передать имя файла в качестве второго аргумента функции).
library(Seurat)
genelist <- list(
    l1 = sample(rownames(pbmc_small), 23),
    l2 = sample(rownames(pbmc_small), 14),
    l3 = sample(rownames(pbmc_small), 4))

plotFeatures <- function(x){
    p <- FeaturePlot(object = pbmc_small, 
        features = x[1 : min(20, length(x))], 
        combine = FALSE, label.size = 2)
    out <- cowplot::plot_grid(plotlist = p, ncol = 5, nrow = 4)
    plot(out)
}
lapply(genelist, plotFeatures)
1 голос
/ 06 февраля 2020

Не проверено, что-то подобное должно работать. Вместо того, чтобы вызывать print 5 раз для каждых 5 генов, мы называем это в al oop n раз в зависимости от количества генов. Если у нас будет 10 генов, то forl oop будет печатать дважды, если 20, тогда мы вызываем print 4 раза, et c:

groupNames <- c("cluster1_2","cluster2_3","cluster3_4","cluster4_5","cluster5_6")

for (i in 1:length(listGroups)) {
  Grouplist <- listGroups[[i]]
  genesList <- Grouplist['gene']
  #lengths(geneList)
  print(groupNames[i])
  # Make Featureplots for top20 DE genes per cluster_group

  # make chunks of 5 each. 
  myChunks <- split(genesList, ceiling(seq_along(genesList)/5))

  pdf(file=paste0(sampleFolder,"/Featureplots_cluster_",groupNames[i],"_",sampleName,".pdf"))

  # loop through genes plotting 5 genes each time.
  for(x %in% seq(myChunks) ){
    print(FeaturePlot(object = seuratObj, features = myChunks[[ x ]]))
  }

  dev.off()
}
0 голосов
/ 06 февраля 2020

Благодаря вводу zx8754 и user12728748. Я нашел два решения для моей проблемы.

        for (i in 1:length(listGroups)) {
      Grouplist <- listGroups[[1]]
      genesList <- Grouplist['gene']
      print(groupNames[1])

    ## Solution 1
    # Here all genes are printed. I didn't find a way yet to limited to 20

      # make chunks of 5 each. 
      myChunks <- split(genesList,ceiling(seq(lengths(genesList))/5))
      # Make Featureplots for top20 DE genes per cluster_group
      pdf(file=paste0(sampleFolderAggr,"results/Featureplots_",groupNames[i],"_",sampleNameAggr,".pdf"))
      # loop through genes plotting 5 genes each time.
      for(x in 1:min(5, length(myChunks) ){
        # Create a list of 5 genes
        my5Genes <- as.list(myChunks[[x]])

        print(FeaturePlot(object = seuratObj, features = c(as.character(my5Genes$gene))))
      }
      dev.off()

    ## Solution 2

    pdf(file=paste0(sampleFolderAggr,"results/Featureplots_",groupNames[i],"_",sampleNameAggr,".pdf"))

    plotFeatures <- function(x){
        p <- FeaturePlot(object = seuratObj, features = c(as.character(x[1: min(20, lengths(x)),])), combine = FALSE, label.size = 2)
        out <- cowplot::plot_grid(plotlist = p, ncol = 5, nrow = 4)
        # Make Featureplots for top20 DE genes per cluster_group
        plot(out)
        }
      lapply(genelist, plotFeatures)
      dev.off()
    }
...