当所有细胞基因表达量相同时如何更好的可视化?
绘制FeaturePlot时,遇到基因在所有细胞中表达水平相同展示效果不理想的情况,本文引入函数tryCatch()旨在解决上述问题,并将警告信息保存到日志文件中便于后续追踪。
1 加载R包
library(easypackages)
packages <- c('ggplot2', 'cowplot', 'Seurat')
libraries(packages)
2 挑选所有细胞中表达水平相同的基因
# 引入内置数据pmbc_small
pbmc_small
## An object of class Seurat
## 230 features across 80 samples within 1 assay
## Active assay: RNA (230 features, 20 variable features)
## 2 dimensional reductions calculated: pca, tsne
# 从全部基因集中挑选在所有细胞中表达量相同的基因
object_seurat <- pbmc_small
dat <- as.matrix(object_seurat@assays$RNA@counts)
dat_t <- t(dat)
search_same_value_row <- function(i){
if(all(dat_t[,i]==dat_t[,i][1] )){
print(colnames(dat_t)[i])
}
}
my_genes <- purrr::map_dfc(1:dim(dat_t)[2], search_same_value_row)
gene_same.value = as.character(my_genes)
# 结果表明:不存在所有细胞表达水平都为0的基因!!!
# 取子集再挑选基因
sub_cells <- subset(pbmc_small, cells = sample(Cells(pbmc_small), 20))
object_seurat <- sub_cells
dat <- as.matrix(object_seurat@assays$RNA@counts)
dat_t <- t(dat)
dim(dat_t)
## [1] 20 230
search_same_value_row <- function(i){
if(all(dat_t[,i]==dat_t[,i][1] )){
print(colnames(dat_t)[i])
}
}
my_genes <- purrr::map_dfc(1:dim(dat_t)[2], search_same_value_row)
## [1] "NCF1"
## [1] "CD180"
## [1] "IGLL5"
## [1] "DLGAP1-AS1"
## [1] "ZNF76"
## [1] "PTPN22"
## [1] "VSTM1"
## [1] "CD1C"
gene_same.value = as.character(my_genes)
# 结果表明:存在少数在所有细胞表达水平相同的基因!!!
# 高可变基因集
gene_highly = VariableFeatures(sub_cells)[! VariableFeatures(sub_cells) %in% as.character(my_genes)]
3 基因表达水平的可视化
seurat_object <- sub_cells
gene_set <- c(gene_highly[c(13,18)], gene_same.value[1:2])
feature_plot_fun <- function(gene_set){FeaturePlot(seurat_object , gene_set, cols = c("lightgrey", "blue"), pt.size=2, reduction="tsne")}
VlnPlot_plot_fun <- function(gene_set){VlnPlot(seurat_object, gene_set, pt.size=2)+ NoLegend() + ggtitle(label=gene_set)}
feature_plot <- purrr::map(gene_set, feature_plot_fun)
VlnPlot_plot <- purrr::map(gene_set, VlnPlot_plot_fun)
featureplot1_cluster <- CombinePlots(plots=feature_plot, nrow=1)
VlnPlot_plot_cluster <- CombinePlots(plots=VlnPlot_plot, nrow=1)
plot_grid(plotlist=list(VlnPlot_plot_cluster, featureplot1_cluster), nrow=2)
对比小提琴图可以看出,当基因在所有细胞中表达水平相同时,即使表达量都为零却高亮显示,容易对实际表达解读造成误解,影响了可视化效果,故引入函数tryCatch()。
4 tryCatch容错函数
try就像一个网,把try{}里面的代码所跑出的异常都网住,然后把异常就给catch{}里面的代码去执行,最后执行finally之中的代码。无论try中代码有没有异常,也无论catch是否被异常捕获到,finally中的代码都一定会被执行。
有时需要判断一行命令运行的状态,然后再做出反应,整体来说:
1 是否出现warning,出现了怎么处理?
2 是否出现Error,出现了怎么处理?
3 没有出现怎么处理?
tryCatch({
命令
}, warning = function(w){
# 这里是出现warning状态时,应该怎么做,可以用print打印出来,可以执行其它命令
}, error = function(e){
# 这里是出现Error状态时,应该怎么做,可以用print打印出来,也可以执行其它命令
},finally = {
# 这里是运行正常时,应该怎么做,可以用print打印出来,也可以执行其它命令
})
## NULL
5 保存警告信息到日志文件中
# 创建空日志文件
file.create('my_log.txt')
## [1] TRUE
log.path = 'my_log.txt'
feature_plot_fun <- function(gene_set){
tryCatch({
f1 <- FeaturePlot(seurat_object, gene_set, cols = c("lightgrey", "blue"), pt.size=2, reduction="tsne")
}, warning = function(w){
# 这里是出现warning状态时,应该怎么做,可以用print打印出来,可以执行其它命令
# print(paste('warning:', w))
f2 <- FeaturePlot(seurat_object, gene_set, cols = c("lightgrey", "lightgrey"), pt.size=2, reduction="tsne")
write(toString(w), log.path, append=TRUE) # 保存警告信息到日志文件中
return(f2)
})
}
6 再次基因表达水平的可视化
feature_plot <- purrr::map(gene_set, feature_plot_fun)
VlnPlot_plot <- purrr::map(gene_set, VlnPlot_plot_fun)
featureplot1_cluster <- CombinePlots(plots=feature_plot, nrow=1)
VlnPlot_plot_cluster <- CombinePlots(plots=VlnPlot_plot, nrow=1)
plot_grid(plotlist=list(VlnPlot_plot_cluster, featureplot1_cluster), nrow=2)
References
[1]
R语言tryCatch使用方法:判断Warning和Error: http://blog.sciencenet.cn/blog-2577109-1251678.html
[2]
Basic Error Handing in R with tryCatch(): https://www.r-bloggers.com/2020/10/basic-error-handing-in-r-with-trycatch/
[3]
Feature Plot with 0 count data: https://github.com/satijalab/seurat/issues/1557