单细胞测序分析之Seurat(3.0)包学习笔记

上一篇文章深入学习了Monocle2包,这次来继续学习Seurat包。
Seurat官方网站:https://satijalab.org/seurat/v3.1/pbmc3k_tutorial.html

Seurat包是个什么包?
Seurat是一个用于质量控制、分析和探索单细胞RNA-seq数据的R包。Seurat使用户能够鉴定和解释来自单细胞转录本测定的异质性来源,并可以整合成多种类型的单细胞数据。

安装Seurat

使用之前先安装。目前最新的是3.0版本,你可以直接在R里安装(要求R是3.4版本或更高),super easy:

> install.packages('Seurat')
> library(Seurat)

如果有些同学想安装低版本的怎么办呢?比如2.3.4这个版本:

> source("https://z.umn.edu/archived-seurat")

如果你还想安装更老的版本,就需要如下代码:

> install.packages('devtools')
# 替换成2.3.0版本
>devtools::install_version(package = 'Seurat', version = package_version('2.3.0'))
> library(Seurat)

建立Seurat对象

在这个教程里,我们将分析来自10X Genomics外周血单核细胞(PBMC)数据,这个dataset是用Illumina NextSeq 500平台进行测序,包含了2700个细胞。原始数据在这里下载:here.

这个原始数据来自CellRanger的处理,Cellranger返回一个UMI的count矩阵。矩阵里的列是细胞,行是基因。接下来我们用count矩阵创建Seurat对象。这个对象就好比一个容器,里面装着单细胞数据集,比如count矩阵,PCA,聚类结果等等。举个栗子:count matrix 储存在pbmc[["RNA"]]@counts里。

> library(dplyr)
> library(Seurat)

# 导入PBMC数据,用Read10×这个参数
> pbmc.data <- Read10X(data.dir = "../data/pbmc3k/filtered_gene_bc_matrices/hg19/")
# 起始的Seurat对象是原始数据,没有经过标准化的
> 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)

如果在R studio打开后,大概长这样:

那我想看看具体的某个基因在这个矩阵里每个细胞的表达情况怎么看呢?

> pbmc.data[c("CD3D", "TCL1A", "MS4A1"), 1:30]
3 x 30 sparse Matrix of class "dgCMatrix"
   [[ suppressing 30 column names 'AAACATACAACCAC', 'AAACATTGAGCTAC', 'AAACATTGATCAGC' ... ]]
                                                                   
CD3D  4 . 10 . . 1 2 3 1 . . 2 7 1 . . 1 3 . 2  3 . . . . . 3 4 1 5
TCL1A . .  . . . . . . 1 . . . . . . . . . . .  . 1 . . . . . . . .
MS4A1 . 6  . . . . . . 1 1 1 . . . . . . . . . 36 1 2 . . 2 . . . .

这里的点代表0,意思是这些基因在这个细胞里没有被检测到。因为大部分基因在单细胞RNA-seq矩阵里都是0,所以Seurat尽可能使用稀疏矩阵(sparse-matrix)表示。这为Drop-seq/inDrop/10x数据节省了大量内存和速度。

标准的预处理工作流程

质量控制,选择需要分析的细胞

Seurat允许你简单的过滤一下你的细胞,质控的一般指标包括:

  • 在每个细胞里检测到的基因
    • 低质量细胞或者空的droplets只有非常少量的基因
    • 细胞doublets 或者 multiplets 有非常高的基因count数
  • 在一个细胞内检测到的分子数
  • 读取到线粒体基因组的比例
    • 低质量/死细胞通常有很高的线粒体污染
    • 我们使用“PercentageFeatureSet”函数计算线粒体QC指标
    • 使用所有以“MT-”开头的基因作为线粒体基因
# 把表达矩阵里的线粒体QC单独存放在Seurat对象里,等于添加一列到metadata的对象里
> pbmc[["percent.mt"]] <- PercentageFeatureSet(pbmc, pattern = "^MT-")

添加后我们可以看一下,是否添加成功了:

#看metadata的前5行
> head(pbmc@meta.data, 5)
               orig.ident nCount_RNA nFeature_RNA percent.mt
AAACATACAACCAC     pbmc3k       2419          779  3.0177759
AAACATTGAGCTAC     pbmc3k       4903         1352  3.7935958
AAACATTGATCAGC     pbmc3k       3147         1129  0.8897363
AAACCGTGCTTCCG     pbmc3k       2639          960  1.7430845
AAACCGTGTATGCG     pbmc3k        980          521  1.2244898

我们还可以可视化QC指标,并用它们来过滤细胞:
(1)将unique基因count数超过2500,或者小于200的细胞过滤掉。
(2)把线粒体count数占5%以上的细胞过滤掉

> VlnPlot(pbmc, features = c("nFeature_RNA", "nCount_RNA", "percent.mt"), ncol = 3)

我们还可以用FeatureScatter函数来可视化特征-特征之间的关系,可以使用Seurat对象里的任何东西,如对象中的列、PC分数等。

> plot1 <- FeatureScatter(pbmc, feature1 = "nCount_RNA", feature2 = "percent.mt")
> plot2 <- FeatureScatter(pbmc, feature1 = "nCount_RNA", feature2 = "nFeature_RNA")
> CombinePlots(plots = list(plot1, plot2))
> pbmc <- subset(pbmc, subset = nFeature_RNA > 200 & nFeature_RNA < 2500 & percent.mt < 5)

标准化数据

在去除掉不想要的细胞后,就可以标准化数据了。在默认情况下,我们使用global-scaling标准化方法,称为“LogNormalize”,这种方法是利用总的表达量对每个细胞里的基因表达值进行标准化,乘以一个scale factor(默认值是10000),再用log转换一下。标准化后的数据存放在pbmc[["RNA"]]@data里。

> pbmc <- NormalizeData(pbmc, normalization.method = "LogNormalize", scale.factor = 10000)
Performing log-normalization
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|

当然上面的代码中,我们用的参数都是默认值,在这种情况下,上面这行代码也可以写成更简单的形式:

> pbmc <- NormalizeData(pbmc)

鉴定高度变化的基因

接下来我们要计算在pbmc里细胞之间变化度很高的基因集(这些基因在一些细胞中高表达,在另一些细胞中低表达),这一步用FindVariableFeatures函数来执行。默认情况下,每个dataset返回2,000个基因。这些基因将用于下游分析,如PCA。

> pbmc <- FindVariableFeatures(pbmc, selection.method = "vst", nfeatures = 2000)
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|

之后从这些基因里挑选10个变化程度最高的基因:

> top10 <- head(VariableFeatures(pbmc), 10)

下面是将这些基因可视化出来,并把top10的基因名称标记出来:

> plot1 <- VariableFeaturePlot(pbmc)
> plot2 <- LabelPoints(plot = plot1, points = top10, repel = TRUE)
When using repel, set xnudge and ynudge to 0 for optimal results
> CombinePlots(plots = list(plot1, plot2))

scaling the data(数据比例缩放)

接下来,用一个线性变换(“缩放scaling”)。这是在降维前(例如PCA)一个标准的预处理步骤,用ScaleData函数:
(1)shift每个基因的表达,使细胞间的平均表达为0
(2)缩放每个基因的表达,使细胞间的差异为1
这一步给予下游分析同等的权重,这样那些非常高表达的基因就不会掩盖其他基因的变化,其结果存储在pbmc[["RNA"]]@scale.data中。

> all.genes <- rownames(pbmc)
> pbmc <- ScaleData(pbmc, features = all.genes)
Centering and scaling data matrix
  |====================================================================| 100%

scaling是Seurat流程中的一个重要步骤,但仅限于将作为PCA input的基因。因此,ScaleData中的默认值只是对前面确定的2000个基因执行缩放。要做到这一点,可以忽略前面函数调用中的features参数,用下面简单的代码就行:

pbmc < - ScaleData (pbmc)

这样你的PCA和聚类结果将不受影响。然而,Seurat heatmap需要对heatmap中的基因进行缩放,以确保高表达基因不会主导heatmap。为了确保我们在后面的热图中不会遗漏任何基因,我们将在本教程中缩放了所有基因。

线性降维

接下来我们对scaling后的数据进行PCA,在默认值下,只对前面选出的2000个基因基因降维,但是你也可以选择想要降维的基因集。

> pbmc <- RunPCA(pbmc, features = VariableFeatures(object = pbmc))
PC_ 1 
Positive:  CST3, TYROBP, LST1, AIF1, FTL, FTH1, LYZ, FCN1, S100A9, TYMP 
       FCER1G, CFD, LGALS1, S100A8, CTSS, LGALS2, SERPINA1, IFITM3, SPI1, CFP 
       PSAP, IFI30, SAT1, COTL1, S100A11, NPC2, GRN, LGALS3, GSTP1, PYCARD 
Negative:  MALAT1, LTB, IL32, IL7R, CD2, B2M, ACAP1, CD27, STK17A, CTSW 
       CD247, GIMAP5, AQP3, CCL5, SELL, TRAF3IP3, GZMA, MAL, CST7, ITM2A 
       MYC, GIMAP7, HOPX, BEX2, LDLRAP1, GZMK, ETS1, ZAP70, TNFAIP8, RIC3 
PC_ 2 
Positive:  CD79A, MS4A1, TCL1A, HLA-DQA1, HLA-DQB1, HLA-DRA, LINC00926, CD79B, HLA-DRB1, CD74 
       HLA-DMA, HLA-DPB1, HLA-DQA2, CD37, HLA-DRB5, HLA-DMB, HLA-DPA1, FCRLA, HVCN1, LTB 
       BLNK, P2RX5, IGLL5, IRF8, SWAP70, ARHGAP24, FCGR2B, SMIM14, PPP1R14A, C16orf74 
Negative:  NKG7, PRF1, CST7, GZMB, GZMA, FGFBP2, CTSW, GNLY, B2M, SPON2 
       CCL4, GZMH, FCGR3A, CCL5, CD247, XCL2, CLIC3, AKR1C3, SRGN, HOPX 
       TTC38, APMAP, CTSC, S100A4, IGFBP7, ANXA1, ID2, IL32, XCL1, RHOC 
PC_ 3 
Positive:  HLA-DQA1, CD79A, CD79B, HLA-DQB1, HLA-DPB1, HLA-DPA1, CD74, MS4A1, HLA-DRB1, HLA-DRA 
       HLA-DRB5, HLA-DQA2, TCL1A, LINC00926, HLA-DMB, HLA-DMA, CD37, HVCN1, FCRLA, IRF8 
       PLAC8, BLNK, MALAT1, SMIM14, PLD4, LAT2, IGLL5, P2RX5, SWAP70, FCGR2B 
Negative:  PPBP, PF4, SDPR, SPARC, GNG11, NRGN, GP9, RGS18, TUBB1, CLU 
       HIST1H2AC, AP001189.4, ITGA2B, CD9, TMEM40, PTCRA, CA2, ACRBP, MMD, TREML1 
       NGFRAP1, F13A1, SEPT5, RUFY1, TSC22D1, MPP1, CMTM5, RP11-367G6.3, MYL9, GP1BA 
PC_ 4 
Positive:  HLA-DQA1, CD79B, CD79A, MS4A1, HLA-DQB1, CD74, HLA-DPB1, HIST1H2AC, PF4, TCL1A 
       SDPR, HLA-DPA1, HLA-DRB1, HLA-DQA2, HLA-DRA, PPBP, LINC00926, GNG11, HLA-DRB5, SPARC 
       GP9, AP001189.4, CA2, PTCRA, CD9, NRGN, RGS18, GZMB, CLU, TUBB1 
Negative:  VIM, IL7R, S100A6, IL32, S100A8, S100A4, GIMAP7, S100A10, S100A9, MAL 
       AQP3, CD2, CD14, FYB, LGALS2, GIMAP4, ANXA1, CD27, FCN1, RBP7 
       LYZ, S100A11, GIMAP5, MS4A6A, S100A12, FOLR3, TRABD2A, AIF1, IL8, IFI6 
PC_ 5 
Positive:  GZMB, NKG7, S100A8, FGFBP2, GNLY, CCL4, CST7, PRF1, GZMA, SPON2 
       GZMH, S100A9, LGALS2, CCL3, CTSW, XCL2, CD14, CLIC3, S100A12, CCL5 
       RBP7, MS4A6A, GSTP1, FOLR3, IGFBP7, TYROBP, TTC38, AKR1C3, XCL1, HOPX 
Negative:  LTB, IL7R, CKB, VIM, MS4A7, AQP3, CYTIP, RP11-290F20.3, SIGLEC10, HMOX1 
       PTGES3, LILRB2, MAL, CD27, HN1, CD2, GDI2, ANXA5, CORO1B, TUBA1B 
       FAM110A, ATP1A1, TRADD, PPA1, CCDC109B, ABRACL, CTD-2006K23.1, WARS, VMO1, FYB 

Seurat 提供几种方法可以对PCA分析后的细胞和基因进行可视化:VizDimReduction, DimPlot, 和DimHeatmap。

> VizDimLoadings(pbmc, dims = 1:2, reduction = "pca")
> DimPlot(pbmc, reduction = "pca")

下面的热图里,可以帮你简单的探索一下dataset里异质性的来源,在你决定下游用哪些PC进行分析时会非常有用。细胞和基因根据它们的PCA值进行排序。用cells这个参数可以定义在排序里最高的和最低的一些细胞:

#只画第一个主成分
> DimHeatmap(pbmc, dims = 1, cells = 500, balanced = TRUE)

也可以画很多个PC:

> DimHeatmap(pbmc, dims = 1:15, cells = 500, balanced = TRUE)
只截了一部分图

决定“维数”

为了克服scRNA-seq数据中大量的技术噪声,Seurat基于它们的PCA值对细胞进行聚类。那么怎么才能知道我们需要几个主成分进行分析呢?
有两种方法:

(1)用JackStrawPlot函数

它可以比较每个PC的p-值的分布,显著的PC会有很低的p value,:

#这一步需要很长的时间
> pbmc <- JackStraw(pbmc, num.replicate = 100)
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=04m 34s
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=00s  
> pbmc <- ScoreJackStraw(pbmc, dims = 1:20)

可视化:

> JackStrawPlot(pbmc, dims = 1:15)
在这图里可以看出,显著性从第10个PC到12个PC就开始急剧下降了

(2)Elbow plot法

弯道图主要是看画出来的点在哪一个PC处“转弯”:

> ElbowPlot(pbmc)

这里我们选择了10,但是我们建议在用户分析自己的数据时,选择不同的PC数来重复下游分析(10,15,甚至50),这里也不要选择过少的PC数,会显著影响下游的分析结果。

细胞聚类

首先我们在PCA空间里根据欧氏距离构建一个KNN图,并在任意两个细胞间要确定它们的边缘权重,这个过程用FindNeighbors函数,这里的input就是前面我们定义的dataset的维数。
接下来再用FindClusters函数,该函数有一个“分辨率”的参数,该参数设置下游聚类的“粒度”,值越高,得到的聚类数越多。这个参数设置在0.4-1.2之间,对于3千个左右的单细胞数据通常会得到比较好的结果。对于较大的数据集,最佳分辨率通常会增加。

> pbmc <- FindNeighbors(pbmc, dims = 1:10)
Computing nearest neighbor graph
Computing SNN
> pbmc <- FindClusters(pbmc, resolution = 0.5)
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 2638
Number of edges: 96033

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8720
Number of communities: 9
Elapsed time: 0 seconds
#用Idents函数看一下前5个细胞的聚类情况
> head(Idents(pbmc), 5)
AAACATACAACCAC AAACATTGAGCTAC AAACATTGATCAGC AAACCGTGCTTCCG AAACCGTGTATGCG 
             1              3              1              2              6 
Levels: 0 1 2 3 4 5 6 7 8

非线性降维

Seurat提供了几种非线性的降维技术,如tSNE和UMAP。这些算法的目标是在低维空间中将相似的细胞放在一起。上面所确定的基于图的集群中的单元应该在这些降维图上共同定位。作为UMAP和tSNE的input,我们建议使用与聚类分析的输入相同的PCs作为输入。

> pbmc <- RunUMAP(pbmc, dims = 1:10)
15:28:31 UMAP embedding parameters a = 0.9922 b = 1.112
15:28:31 Read 2638 rows and found 10 numeric columns
15:28:31 Using Annoy for neighbor search, n_neighbors = 30
15:28:31 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
15:28:32 Writing NN index file to temp file /tmp/RtmpoZ1H8s/file30314c4df890
15:28:32 Searching Annoy index using 1 thread, search_k = 3000
15:28:33 Annoy recall = 100%
15:28:33 Commencing smooth kNN distance calibration using 1 thread
15:28:34 Initializing from normalized Laplacian + noise
15:28:34 Commencing optimization for 500 epochs, with 105386 positive edges
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
15:28:43 Optimization finished
> DimPlot(pbmc, reduction = "umap")
> saveRDS(pbmc, file = "../pbmc_tutorial.rds")

寻找差异表达基因

Seurat可以帮助你定义cluster的差异表达,默认情况下,它定义单个cluster的阳性和阴性的marker(与其他细胞群比较)。FindAllMarkers可以执行这个过程。

#在cluster1里寻找marker
#min.pct参数定义了一个基因在两组细胞任意一组里的最低可检测到的百分率
> cluster1.markers <- FindMarkers(pbmc, ident.1 = 1, min.pct = 0.25)
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=04s  
> head(cluster1.markers, n = 5)
            p_val avg_logFC pct.1 pct.2    p_val_adj
IL32 1.894810e-92 0.8373872 0.948 0.464 2.598542e-88
LTB  7.953303e-89 0.8921170 0.981 0.642 1.090716e-84
CD3D 1.655937e-70 0.6436286 0.919 0.431 2.270951e-66
IL7R 3.688893e-68 0.8147082 0.747 0.325 5.058947e-64
LDHB 2.292819e-67 0.6253110 0.950 0.613 3.144372e-63
#寻找cluster5与cluster0和3之间的差异marker
> cluster5.markers <- FindMarkers(pbmc, ident.1 = 5, ident.2 = c(0, 3), min.pct = 0.25)
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=10s  
> head(cluster5.markers, n = 5)
                      p_val avg_logFC pct.1 pct.2     p_val_adj
FCGR3A        7.583625e-209  2.963144 0.975 0.037 1.040018e-204
IFITM3        2.500844e-199  2.698187 0.975 0.046 3.429657e-195
CFD           1.763722e-195  2.362381 0.938 0.037 2.418768e-191
CD68          4.612171e-192  2.087366 0.926 0.036 6.325132e-188
RP11-290F20.3 1.846215e-188  1.886288 0.840 0.016 2.531900e-184

你还可以寻找每一个cluster里与其他所有细胞相比之后的差异marker:

> pbmc.markers <- FindAllMarkers(pbmc, only.pos = TRUE, min.pct = 0.25, logfc.threshold = 0.25)
Calculating cluster 0
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=03s  
Calculating cluster 1
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=02s  
Calculating cluster 2
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=08s  
Calculating cluster 3
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=03s  
Calculating cluster 4
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=03s  
Calculating cluster 5
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=11s  
Calculating cluster 6
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=09s  
Calculating cluster 7
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=09s  
Calculating cluster 8
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=08s  
> pbmc.markers %>% group_by(cluster) %>% top_n(n = 2, wt = avg_logFC)
# A tibble: 18 x 7
# Groups:   cluster [9]
       p_val avg_logFC pct.1 pct.2 p_val_adj cluster gene    
       <dbl>     <dbl> <dbl> <dbl>     <dbl> <fct>   <chr>   
 1 1.96e-107     0.730 0.901 0.594 2.69e-103 0       LDHB    
 2 1.61e- 82     0.922 0.436 0.11  2.20e- 78 0       CCR7    
 3 7.95e- 89     0.892 0.981 0.642 1.09e- 84 1       LTB     
 4 1.85e- 60     0.859 0.422 0.11  2.54e- 56 1       AQP3    
 5 0.            3.86  0.996 0.215 0.        2       S100A9  
 6 0.            3.80  0.975 0.121 0.        2       S100A8  
 7 0.            2.99  0.936 0.041 0.        3       CD79A   
 8 9.48e-271     2.49  0.622 0.022 1.30e-266 3       TCL1A   
 9 2.96e-189     2.12  0.985 0.24  4.06e-185 4       CCL5    
10 2.57e-158     2.05  0.587 0.059 3.52e-154 4       GZMK    
11 3.51e-184     2.30  0.975 0.134 4.82e-180 5       FCGR3A  
12 2.03e-125     2.14  1     0.315 2.78e-121 5       LST1    
13 7.95e-269     3.35  0.961 0.068 1.09e-264 6       GZMB    
14 3.13e-191     3.69  0.961 0.131 4.30e-187 6       GNLY    
15 1.48e-220     2.68  0.812 0.011 2.03e-216 7       FCER1A  
16 1.67e- 21     1.99  1     0.513 2.28e- 17 7       HLA-DPB1
17 7.73e-200     5.02  1     0.01  1.06e-195 8       PF4     
18 3.68e-110     5.94  1     0.024 5.05e-106 8       PPBP   

Seurat有几种方法可以检测差异表达,用test.use参数来定义你使用的是哪一种,比如说ROC检验,ROC检验返回的是每一个marker的 ‘classification power(分类能力)’(值从0-1,1是最好的):

> cluster1.markers <- FindMarkers(pbmc, ident.1 = 0, logfc.threshold = 0.25, test.use = "roc", only.pos = TRUE)
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=00s  
> head(cluster1.markers, n = 5)
      myAUC  avg_diff power pct.1 pct.2
RPS12 0.822 0.5029988 0.644 1.000 0.991
RPS27 0.822 0.5020359 0.644 0.999 0.992
RPS6  0.820 0.4673635 0.640 1.000 0.995
RPL32 0.815 0.4242773 0.630 0.999 0.995
RPS14 0.807 0.4283480 0.614 1.000 0.994

我们还可以可视化这些marker。VlnPlot (展示在不同cluster里的表达可能分布),FeaturePlot(根据tSNE和PCA结果可视化基因表达)是最常用的可视化方法。你也可以用其他一些方法,例如:RidgePlot, CellScatter, DotPlot。

> VlnPlot(pbmc, features = c("MS4A1", "CD79A"))

你也可以展示原始的count值:

> VlnPlot(pbmc, features = c("NKG7", "PF4"), slot = "counts", log = TRUE)
> FeaturePlot(pbmc, features = c("MS4A1", "GNLY", "CD3E", "CD14", "FCER1A", "FCGR3A", "LYZ", "PPBP",  "CD8A"))

我们还可以用DoHeatmap来画细胞和基因的热图,在这里我们画每一个cluster里的top20的marker。如果不够20个,则画所有的marker。

> top10 <- pbmc.markers %>% group_by(cluster) %>% top_n(n = 10, wt = avg_logFC)
> DoHeatmap(pbmc, features = top10$gene) + NoLegend()

给每一个cluster标记名称

很幸运的是,我们可以很清楚的知道每一个cluster的marker是什么,并可以为它们标记:

> new.cluster.ids <- c("Naive CD4 T", "Memory CD4 T", "CD14+ Mono", "B", "CD8 T", "FCGR3A+ Mono", "NK", "DC", "Platelet")
> names(new.cluster.ids) <- levels(pbmc)
> pbmc <- RenameIdents(pbmc, new.cluster.ids)
> DimPlot(pbmc, reduction = "umap", label = TRUE, pt.size = 0.5) + NoLegend()
> saveRDS(pbmc, file = "../output/pbmc3k_final.rds")
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容