ixxmu / mp_duty

抓取网络文章到github issues保存
https://archives.duty-machine.now.sh/
116 stars 30 forks source link

ggsc:用ggplot语法来画你的单细胞数据 #4021

Closed ixxmu closed 12 months ago

ixxmu commented 12 months ago

https://mp.weixin.qq.com/s/VuEKNeA9q-ULGmqHILsBIQ

ixxmu commented 12 months ago

ggsc:用ggplot语法来画你的单细胞数据 by YuLabSMU

上次广告新包上线,其实一年前就写了,当时我叫这个包为scplot,后来发现这包名已经被别人叫了,于是改名ggsc当然先卖个关子,功能远不止今天要讲的

我们直接上代码,从人见人爱的Seurat开始,这个包让几乎所有考研复试的小朋友都说自己跑过单细胞的分析:

library(Seurat)
dir = "filtered_gene_bc_matrices/hg19"

pbmc.data <- Read10X(data.dir = dir)
pbmc <- CreateSeuratObject(counts = pbmc.data, project = "pbmc3k", min.cells=3, min.features=200)
pbmc
## An object of class Seurat
## 13714 features across 2700 samples within 1 assay
## Active assay: RNA (13714 features, 0 variable features)
## Normalizing the data
pbmc <- NormalizeData(pbmc, normalization.method = "LogNormalize",
scale.factor = 10000)

pbmc <- NormalizeData(pbmc)

## Identify the 2000 most highly variable genes
pbmc <- FindVariableFeatures(pbmc, selection.method = "vst", nfeatures = 2000)

## In addition we scale the data
all.genes <- rownames(pbmc)
pbmc <- ScaleData(pbmc, features = all.genes)

pbmc <- RunPCA(pbmc, features = VariableFeatures(object = pbmc),
verbose = FALSE)
pbmc <- FindNeighbors(pbmc, dims = 1:10, verbose = FALSE)
pbmc <- FindClusters(pbmc, resolution = 0.5, verbose = FALSE)
pbmc <- RunUMAP(pbmc, dims = 1:10, umap.method = "uwot", metric = "cosine")

## Run tSNE
pbmc <- RunTSNE(pbmc, reduction = "pca", dims=1:5, tsne.method = "Rtsne")

## Assigning cell type identity to clusters
new.cluster.ids <- c("Naive CD4 T", "CD14+ Mono", "Memory CD4 T", "B", "CD8 T",
"FCGR3A+ Mono", "NK", "DC", "Platelet")
names(new.cluster.ids) <- levels(pbmc)
pbmc <- RenameIdents(pbmc, new.cluster.ids)

降维图

Seurat版本:

DimPlot(pbmc, reduction = "umap",
label = TRUE, pt.size = 0.5)

ggsc版本:

library(ggplot2)
library(ggsc)
sc_dim(pbmc) + sc_dim_geom_label()

就是sc_dim画散点,sc_dim_geom_label画标签。看上去我们除了搞个人见人爱的坐标轴之外,画出来一样。

然而我们能够更灵活:

sc_dim(pbmc) + 
sc_dim_geom_label(geom = shadowtext::geom_shadowtext,
color='black', bg.color='white')

比如用什么图层来画细胞标签,可以传,这里用我写的shadowtext包来画,字就凸显出来了。

基因表达量

Seurat版本:

features = c("MS4A1", "GNLY", "CD3E", 
"CD14", "FCER1A", "FCGR3A",
"LYZ", "PPBP", "CD8A")
FeaturePlot(pbmc,'CD4')

ggsc版本:

sc_feature(pbmc, 'CD4')

如果要同时画几个呢:

Seurat版本:

FeaturePlot(pbmc, features)

Seurat我感觉不好是它是拼图的,表达量的颜色标尺是不一样的,不方便比较,所以我出的是分面,标尺一致,基因的表达量,除了在细胞类型分布的区别之外,谁高谁低一目了然。

ggsc版本:

sc_feature(pbmc, features)

当然分面也有分面的坏处,如果一起展示的基因的表达量实在是具有量级上的差别,那统一标尺,会有些基因的表达量根本没法看。那换成Seurat那种行不?这有何难。

ff <- lapply(features, sc_feature, object=pbmc)
aplot::plot_list(gglist= ff, ncol=3)

无非是独自出图,然后拼。

好了,前面是和Seurat类比的一个函数,应该说更强大,但没有体现出图形语法是不是?没问题的,我们能够做到真正的降维图画了,再在上面把你选中的基因画出来。比如这样子:

sc_dim(pbmc) + 
sc_dim_geom_feature(pbmc, 'CD4', color='black')

多个基因同样适用:

sc_dim(pbmc, alpha=.3) + 
ggnewscale::new_scale_color() +
sc_dim_geom_feature(pbmc, features, mapping=aes(color=features)) +
scale_color_viridis_d()

我们可以把背景换成灰色,高亮选中的基因,而选中的基因,除了用表达量,你还可以用别的变量来映射,任君选择:

sc_dim(pbmc, alpha=.3, reduction = 'tsne', color='grey50') +
sc_dim_geom_feature(pbmc, features, mapping=aes(color=features))

它提供给我们的,是更大的自由度,和灵活的语法,当然也带来了更多的可能性。以及有什么需求,向我们提,经常能够实现愿望。我当时写这个包,其中一个原因就是我觉得Seurat画的图太丑,真的很丑。


未完待续...