
生信小记:Seurat包的数据可视化方法
在这篇教程中,我们会沿用上一篇教程处理好的数据来进行演示。
先做一些前期准备,安装并加载好R包,下载并加载好数据(或者直接运用上一篇教程中处理好的数据)。
1 | install.packages(c("Seurat","patchwork","ggplot2","SeuratData")) |
- 运行结果
1 | An object of class Seurat |
五种可视化标志基因的方法
山脊图(Ridge Plots)
山脊图可以反映在细胞集群中,某个基因的大体表达分布。
1 | RidgePlot(pbmc3k.final, features = features, ncol = 2) |

小提琴图(Violin Plots)
意义同上。
1 | VlnPlot(pbmc3k.final, features = features) |

特征图(Feature Plots)
可以在降维后的图象中展示不同基因的表达情况。
1 | FeaturePlot(pbmc3k.final, features = features) |

点图(Dot Plots)
在点图中,点的大小表示在细胞集群中,表达某个基因的细胞所占比例;而点的颜色深浅则代表在细胞集群中,某个基因的平均表达水平。
1 | DotPlot(pbmc3k.final, features = features) + RotatedAxis() |

热图(Heatmap)
1 | DoHeatmap(subset(pbmc3k.final, downsample = 100), features = features, size = 3) |

在特征图上玩点新花样
我们可以经验性地设定颜色最深或最浅所代表的基因表达水平。
1 | FeaturePlot(pbmc3k.final, features = "MS4A1") + FeaturePlot(pbmc3k.final, features = "MS4A1", min.cutoff = 1, max.cutoff = 3) |

也可以让软件计算第10百分位数(q10)和第90百分位数(q90),以此作为颜色显示的基准。这种方法特别适用于需要处理多个基因的数据的时候。
1 | FeaturePlot(pbmc3k.final, features = c("MS4A1", "PTPRCAP"), min.cutoff = "q10", max.cutoff = "q90") |

如果我们想探究两个基因的共表达情况,我们可以这么做:
1 | FeaturePlot(pbmc3k.final, features = c("MS4A1", "CD79A"), blend = TRUE) |

在实际的生信分析中,我们经常会遇到分组的情况(可能是健康人和患者的分组,也有可能是不同程度患者的分组,也有可能是不同疾病患者的分组)。这个时候我们需要对比不同组的同一基因的表达情况,可以这么做:
1 | FeaturePlot(pbmc3k.final, features = c("MS4A1", "CD79A"), split.by = "groups") |

然后我尝试了大杂烩(
1 | FeaturePlot(pbmc3k.final, features = c("MS4A1", "PTPRCAP"), min.cutoff = "q10", max.cutoff = "q90", blend = TRUE, split.by = "groups") |

可视化的进阶玩法
除了基因的表达水平之外,小提琴图还能显示其他变量在不同细胞簇中的分布情况。例如,通过下列代码,我们可以显示两个组中不同细胞簇的线粒体基因比例。
1 | VlnPlot(pbmc3k.final, features = "percent.mt", split.by = "groups") |

点图也能分组!
1 | DotPlot(pbmc3k.final, features = features, split.by = "groups") + RotatedAxis() |

DimPlot()函数可以用来展示UMAP、$t$-SNE和PCA降维结果,展示的优先级为UMAP>$t$-SNE>PCA。也就是在没有进行任何设置的情况下,该函数默认展示经UMAP降维后的图象。
1 | DimPlot(pbmc3k.final) |

如果需要展示PCA降维后的数据,我们需要将原始数据集进行备份,然后在备份数据集上删除UMAP分析结果。(如果还进行了$t$-SNE分析,则还需要删除$t$-SNE分析结果,否则会有限展示$t$-SNE分析结果)。
1 | pbmc3k.final.no.umap <- pbmc3k.final |

在热图中,默认按照细胞簇进行分群,如果需要按照其他标准分群,可以更改$group.by$的参数。
1 | DoHeatmap(pbmc3k.final, features = VariableFeatures(pbmc3k.final)[1:100], cells = 1:500, size = 4, angle = 90) + NoLegend() |

根据实际需要对图象进行个性化设置
增加标题
1 | baseplot <- DimPlot(pbmc3k.final, reduction = "umap") |

更改主题(此处改为PowerPoint主题)
1 | remotes::install_github('sjessa/ggmin') #因为不是自带的主题……所以需要安装所需要的扩张包 |

1 | baseplot + DarkTheme() #黑色主题是自带的,无需ggmin |

使用FontSize()调整字体大小
1 | baseplot + FontSize(x.title = 20, y.title = 20) + NoLegend() |

交互式绘图
对于任何ggplot2生成的图象,可以利用HoverLocator()函数生成一个可交互的图象。以下面的代码为例,所生成的特征图允许我们查看每一个细胞的ident、PC_1和nFeature_RNA。
1 | plot <- FeaturePlot(pbmc3k.final, features = "MS4A1") #生成特殊图 |
在R中生成交互式图象之后,如何把交互式图象上传到自己的Hexo博客仍然是一个比较困难的问题。对于不使用Hexo博客记录自己学习过程的朋友,这个问题无关紧要,可以跳过。不过如果你对我如何解决这个问题感兴趣,欢迎点这里进一步了解!
Seurat包还提供了一种可交互的方式,允许我们手动选择部分细胞进行进一步的分析。
1 | pbmc3k.final <- RenameIdents(pbmc3k.final, DC = "CD14+ Mono") |
这里因为懒得搞gif,所以直接搬运了官方教程上的gif图:

- 运行结果
1 | > head(select.cells) |
选择需要的细胞之后,可以将这些细胞定义为“新细胞簇”,进行进一步的分析。
1 | Idents(pbmc3k.final, cells = select.cells) <- "NewCells" |
- 运行结果
1 | > head(newcells.markers) |
利用CellSelector()函数,我们还可以将选中的细胞自动标记为新的细胞集群(这里标记为Selected)。
1 | levels(pbmc3k.final)#标记前 |
- 运行结果:
1 | > levels(pbmc3k.final) |
给点图也加点新花样
利用LabelClusters()函数标注细胞集群
1 | plot <- DimPlot(pbmc3k.final, reduction = "pca") + NoLegend() |

通过设置repel参数避免标签的重叠
TopCells函数可以找出识别对特定主成分(PC)贡献最大的细胞。换句话来说,在前面我们确定了每个细胞簇的特征基因表达模式(主成分)。TopCells()函数可以找出这些细胞簇中特征基因表达模式最极端的细胞。例如说我们确认某个基因表达的上调是某个细胞簇的特征,TopCell()函数就可以找出该基因表达上调得最多的几个细胞。
1 | LabelPoints(plot = plot, points = TopCells(object = pbmc3k.final[["pca"]]), repel = TRUE) |

利用简单的“相加”一次绘制多个图
1 | plot1 <- DimPlot(pbmc3k.final) |

完整代码
1 | install.packages(c("Seurat","patchwork","ggplot2","SeuratData")) |