Прокрутите список выходных графиков фреймов данных
Я пытаюсь построить графики функций или 20 моих главных генов. Вот почему я создал список фреймов данных, эти фреймы данных существуют или разные столбцы содержат значения и имена. Один из этих столбцов во фрейме данных - столбец генов. Мой код превращает первые 20 генов в функциональные графики. Но теперь у меня проблема в некоторых фреймах данных, в которых существует менее 20 генов. Это приводит к прерыванию моего кода.
Поскольку мне нужно максимум 5 графиков функций на странице, я не могу просто определить счетчик.
Спасибо за ваш вклад.
Пример моего списка или списка фреймов данных
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 ответа
Для каждого списка генов вы можете создать один график с выбранными вами генами, подобными этому (график будет хорошо смотреться с большим размером, как в вашем 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)
Не тестировал, примерно так должно работать. Вместо того, чтобы вызывать print 5 раз для каждых 5 генов, мы вызываем его в цикле n раз в зависимости от количества генов. Если у нас есть 10 генов, forloop будет печатать дважды, если 20, то мы вызываем print 4 раза и т. Д.:
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()
}
Благодаря вводу 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()
}