「热图」ComplexHeatmap展示单细胞聚类

2024-06-23 20:18

本文主要是介绍「热图」ComplexHeatmap展示单细胞聚类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

实用Seurat自带的热图函数DoHeatmap绘制的热图,感觉有点不上档次,于是我尝试使用ComplexHeatmap这个R包来对结果进行展示。

个人觉得好的热图有三个要素

  • 聚类: 能够让别人一眼就看到模式
  • 注释: 附加注释能提供更多信息
  • 配色: 要符合直觉,比如说大部分都会认为红色是高表达,蓝色是低表达

在正式开始之前,我们需要先获取一下pbmc的数据,Seurat提供了R包SeuratData专门用于获取数据

devtools::install_github('satijalab/seurat-data')
library(SeuratData)
InstallData("pbmc3k")

加载数据并进行数据预处理,获取绘制热图所需的数据

library(SeuratData)
library(Seurat)
data("pbmc3k")
pbmc <- pbmc3k
pbmc[["percent.mt"]] <- PercentageFeatureSet(pbmc, pattern = "^MT-")
pbmc <- subset(pbmc, subset = nFeature_RNA > 200 & nFeature_RNA < 2500 & percent.mt < 5)
pbmc <- NormalizeData(pbmc, normalization.method = "LogNormalize", scale.factor = 10000)
pbmc <- FindVariableFeatures(pbmc, selection.method = "vst", nfeatures = 2000)
all.genes <- rownames(pbmc)
pbmc <- ScaleData(pbmc, features = all.genes)
pbmc <- RunPCA(pbmc, features = VariableFeatures(object = pbmc))
pbmc <- FindNeighbors(pbmc, dims = 1:10)
pbmc <- FindClusters(pbmc, resolution = 0.5)pbmc.markers <- FindAllMarkers(pbmc, only.pos = TRUE, min.pct = 0.25, logfc.threshold = 0.25)

先感受下Seurat自带热图

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

Seurat-heatmap

下面则是介绍如何用R包ComplexHeatmap进行组图,虽然这个R包名带着Complex,但是并不是说这个R包很复杂,这个Complex应该翻译成复合,也就是说这个R包能在热图的基础上整合很多信息。

先安装并加载R包。

BiocManager::install("ComplexHeatmap")
library(ComplexHeatmap)

为了手动绘制一个热图,要从Seurat对象中提取所需要的表达量矩阵。我提取的是原始的count值,然后用log2(count 1)的方式进行标准化

mat <- GetAssayData(pbmc, slot = "counts")
mat <- log2(mat   1)

获取基因和细胞聚类信息

gene_features <- top10
cluster_info <- sort(pbmc$seurat_annotations)

对表达量矩阵进行排序和筛选

mat <- as.matrix(mat[top10$gene, names(cluster_info)])

Heatmap绘制热图。对于单细胞这种数据,一定要设置如下4个参数

  • cluster_rows= FALSE: 不作行聚类
  • cluster_columns= FALSE: 不作列聚类
  • show_column_names=FALSE: 不展示列名
  • show_row_names=FALSE: 不展示行名,基因数目不多时候可以考虑设置为TRUE
Heatmap(mat,cluster_rows = FALSE,cluster_columns = FALSE,show_column_names = FALSE,show_row_names = TRUE)

Heatmap-1

从图中,我们可以发现以下几个问题:

  • 长宽比不合理,当然这和绘图函数无关,可以在保存时修改长宽比
  • 基因名重叠,考虑调整大小,或者不展示,或者只展示重要的基因
  • 颜色可以调整
  • 缺少聚类信息

这些问题,我们可以通过在ComplexHeatmap Complete Reference查找对应信息来解决。

配色方案

在热图中会涉及到两类配色,一种用来表示表达量的连续性变化,一种则是展示聚类。有一个神奇的R包就是用于处理配色,他的Github地址为 。

devtools::install_github("caleblareau/BuenColors")
library("BuenColors")

它提供了一些列预设的颜色,比方说jdb_color_maps

      HSC       MPP      LMPP       CMP       CLP       MEP       GMP 
"#00441B" "#46A040" "#00AF99" "#FFC179" "#98D9E9" "#F6313E" "#FFA300" pDC      mono     GMP-A     GMP-B     GMP-C       Ery       CD4 
"#C390D4" "#FF5A00" "#AFAFAF" "#7D7D7D" "#4B4B4B" "#8F1336" "#0081C9" CD8        NK         B 
"#001588" "#490C65" "#BA7FD0"

这些颜色就能用于命名单细胞的类群,比如说我选择了前9个

col <- jdb_color_maps[1:9]
names(col) <- levels(cluster_info)

增加列聚类信息

Heatmaprow_splitcolumn_split参数可以通过设置分类变量对热图进行分隔。更多对热图进行拆分,可以参考Heatmap split

Heatmap(mat,cluster_rows = FALSE,cluster_columns = FALSE,show_column_names = FALSE,show_row_names = FALSE,column_split = cluster_info)

Heatmap-2

只用文字描述可能不够好看,最好是带有颜色的分块图,其中里面的颜色和t-SNE或UMAP聚类颜色一致,才能更好的展示信息。

为了增加聚类注释,我们需要用到HeatmapAnnotation函数,它对细胞的列进行注释,而rowAnnotation函数可以对行进行注释。这两个函数能够增加各种类型的注释,包括条形图,点图,折线图,箱线图,密度图等等,这些函数的特征是anno_xxx,例如anno_block就用来绘制区块图。

top_anno <- HeatmapAnnotation(cluster = anno_block(gp = gpar(fill = col), # 设置填充色labels = levels(cluster_info), labels_gp = gpar(cex = 0.5, col = "white"))) # 设置字体

其中anno_block中的gp参数用于设置各类图形参数labels设置标签,labels_gp设置和标签相关的图形参数。可以用?gp来了解有哪些图形参数

Heatmap(mat,cluster_rows = FALSE,cluster_columns = FALSE,show_column_names = FALSE,show_row_names = FALSE,column_split = cluster_info,top_annotation = top_anno, # 在热图上边增加注释column_title = NULL ) # 不需要列标题

Heatmap-3

突出重要基因

由于基因很多直接展示出来,根本看不清,我们可以强调几个标记基因。用到两个函数是rowAnnotationanno_mark

已知不同类群的标记基因如下

Cluster IDMarkers
Cell Type
0
IL7R, CCR7
Naive CD4 T
1
IL7R, S100A4
Memory CD4
2
CD14, LYZ
CD14 Mono
3
MS4A1
B
4
CD8A
CD8 T
5
FCGR3A, MS4A7FCGR3A Mono
6
GNLY, NKG7
NK
7
FCER1A, CST3
DC
8
PPBP
Platelet

我们需要给anno_mark提供基因所在行即可。

mark_gene <- c("IL7R","CCR7","IL7R","S100A4","CD14","LYZ","MS4A1","CD8A","FCGR3A","MS4A7","GNLY","NKG7","FCER1A", "CST3","PPBP")
gene_pos <- which(rownames(mat) %in% mark_gene)row_anno <-  rowAnnotation(mark_gene = anno_mark(at = gene_pos, labels = mark_gene))

接着绘制热图

Heatmap(mat,cluster_rows = FALSE,cluster_columns = FALSE,show_column_names = FALSE,show_row_names = FALSE,column_split = cluster_info,top_annotation = top_anno,right_annotation = row_anno,column_title = NULL)

Heatmap-4

关于如何增加标记注释,参考mark-annotation

调增图例位置

目前的热图还有一个问题,也就是表示表达量范围的图例太占位置了,有两种解决方法

  • 参数设置show_heatmap_legend=FALSE直接删掉。
  • 利用heatmap_legend_param参数更改样式

我们根据legends这一节的内容进行一些调整

Heatmap(mat,cluster_rows = FALSE,cluster_columns = FALSE,show_column_names = FALSE,show_row_names = FALSE,column_split = cluster_info,top_annotation = top_anno,right_annotation = row_anno,column_title = NULL,heatmap_legend_param = list(title = "log2(count 1)",title_position = "leftcenter-rot"))

heatmap-5

因为ComplextHeatmap是基于Grid图形系统,因此可以先绘制热图,然后再用grid::draw绘制图例,从而实现将条形图的位置移动到图中的任意位置。

先获取绘制热图的对象

p <- Heatmap(mat,cluster_rows = FALSE,cluster_columns = FALSE,show_column_names = FALSE,show_row_names = FALSE,column_split = cluster_info,top_annotation = top_anno,right_annotation = row_anno,column_title = NULL,show_heatmap_legend = FALSE)

根据p@matrix_color_mapping获取图例的颜色的设置,然后用Legend构建图例

col_fun  <- circlize::colorRamp2(c(0, 1, 2 ,3, 4),c("#0000FFFF", "#9A70FBFF", "#D8C6F3FF", "#FFC8B9FF", "#FF7D5DFF"))
lgd <-  Legend(col_fun = col_fun, title = "log2(count 1)", title_gp = gpar(col="white", cex = 0.75),title_position = "leftcenter-rot",#direction = "horizontal"at = c(0, 1, 4), labels = c("low", "median", "high"),labels_gp = gpar(col="white"))

绘制图形

grid.newpage() #新建画布
draw(p) # 绘制热图
draw(lgd, x = unit(0.05, "npc"), y = unit(0.05, "npc"), just = c("left", "bottom")) # 绘制图形

heatmap-6

ComplexHeatmap绘制热图非常强大的工具,大部分我想要的功能它都有,甚至我没有想到的它也有,这个教程只是展示其中一小部分功能而已,还有很多功能要慢慢探索。

版权声明:本博客所有文章除特别声明外,均采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 (CC BY-NC-ND 4.0) 进行许可。

扫码即刻交流

这篇关于「热图」ComplexHeatmap展示单细胞聚类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1088174

相关文章

风水研究会官网源码系统-可展示自己的领域内容-商品售卖等

一款用于展示风水行业,周易测算行业,玄学行业的系统,并支持售卖自己的商品。 整洁大气,非常漂亮,前端内容均可通过后台修改。 大致功能: 支持前端内容通过后端自定义支持开启关闭会员功能,会员等级设置支持对接官方支付支持添加商品类支持添加虚拟下载类支持自定义其他类型字段支持生成虚拟激活卡支持采集其他站点文章支持对接收益广告支持文章评论支持积分功能支持推广功能更多功能,搭建完成自行体验吧! 原文

nodejs基础教程-简单blog(8)--展示用户注册信息列表

本节课展示用户注册信息列表;当点击导航栏的“用户管理”浏览器跳转路由/admin/user 显示用户列表。 先上效果图; 开始 1,在layout.html模板中导航标签中设置路径; 2,新建文件 views/admin/user_index.html,在admin.js中设置user_index的路由为/admin/user;并查询数据库所有用户的信息 返回给前台users;

【简单介绍下K-means聚类算法】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步! 💓K-means聚类算法.🎈 💓K-means聚类是一种广泛用于数据挖掘和机器学习的划分方法,它的目标是将n个观测点划分到k个簇中,使得每个点都属于离它最近的均值(即簇中

使用SCALE分析单细胞ATAC-seq数据

SCALE全称是Single-Cell ATAC-seq analysis vie Latent feature Extraction, 从名字中就能知道这个软件是通过隐特征提取的方式分析单细胞ATAC-seq数据。 在文章中,作者从开发者的角度列出了目前的scATAC-seq分析软件,chromVAR, scABC, cisTopic, scVI,发现每个软件都有一定的不足之处,而从我们软件使

「单细胞转录组系列」如何从稀疏矩阵中提取部分数据进行分析

这一篇文章是回答知识星球中一位星友的提问,她的电脑内存有限,无法直接使用所有数据,只能分析部分数据。 数据来源: https://content.cruk.cam.ac.uk/jmlab/atlas_data.tar.gz 解压缩之后,得到下面数据 数据清单 其中raw_counts.mtx是以稀疏矩阵格式存放的表达量数据,文件为6.5G, 用普通的文本编辑器无法打开,

「单细胞转录组系列」如何可靠地确定公共数据集的性别

太长不看版: 文献报道XIST和RPS4Y1是区分性别的两个高可信度的标记基因,因此你没有必要去用其他性染色体上的基因去确定数据集的性别。 不仅仅是在使用公共的单细胞转录组数据,其实早在公共芯片数据或者RNA-seq数据挖掘中,就有人在考虑一个问题,这个数据的元信息作者会不会搞错了呢? 以性别为例,我们很容易想到表达Y染色体上基因数据肯定是男性,但是我们也知道基因也不是任何时刻都表达,所以如

混合型数据聚类(R)

利用聚类分析,我们可以很容易地看清数据集中样本的分布情况。以往介绍聚类分析的文章中通常只介绍如何处理连续型变量,这些文字并没有过多地介绍如何处理混合型数据(如同时包含连续型变量、名义型变量和顺序型变量的数据)。本文将利用 Gower 距离、PAM(partitioning around medoids)算法和轮廓系数来介绍如何对混合型数据做聚类分析。 ----------------------

马尔可夫聚类算法

马尔可夫聚类算法(Markov Clustering Algorithm,MCL)是一种用于图聚类的算法,广泛应用于生物信息学、社交网络分析、推荐系统等领域。 其核心思想是模拟随机游走过程,通过迭代地扩散和收缩图上的概率分布来识别图中的自然聚类或社区结构。 马尔可夫聚类算法的核心步骤 构建转移矩阵: 对于给定的图,生成转移矩阵(Markov Matrix),其中每个元素表示从一个节点转移

基于matlab的K-means聚类图像分割

1 原理 K-means聚类算法在图像分割中的应用是基于一种无监督的学习方法,它将图像中的像素点或特征区域划分为K个不同的簇或类别。以下是K-means聚类算法用于图像分割的原理,包括步骤和公式: 1.1 原理概述 选择簇的数量(K): 首先,用户需要指定要将图像数据分成多少个簇(即K的值)。初始化聚类中心: 随机选择K个像素点作为初始聚类中心。分配数据点到最近的聚类中心: 对于图像中的每个

【Rust日报】 2020-07-09 Rust 机器学习应用:K-means 聚类和可视化

Rust 机器学习应用:K-means 聚类和可视化 虽然机器学习的通用语言是 Python, 但是 Python 本身在计算密集型算法中实际上相当慢的。而 Rust 可能比 Python 快 25 倍。 对于基于 web 的机器学习应用程序来说,基于 Rust、WebAssembly 和 Node.js 的精简软件栈很有意义。Rust 允许我们编写高性能的机器学习函数。为了运行时安全性、跨平台