Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ggplot2热图扩展包(ggalign)的细节

ggplot2热图扩展包(ggalign)的细节

作者头像
生信技能树
发布于 2024-11-21 02:06:50
发布于 2024-11-21 02:06:50
33000
代码可运行
举报
文章被收录于专栏:生信技能树生信技能树
运行总次数:0
代码可运行

前面我们在人工智能大模型不会告诉你的热图绘制技巧 演示了如何使用ggplot2热图扩展包(ggalign),可以快速替代之前的 pheatmap:

比如我们可以先去geo数据库里面下载 GSE104171_NormalizedMatrix.txt.gz 这个文件,然后提取里面的指定的基因的表达量矩阵:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rm(list = ls())#清空当前的工作环境
options(stringsAsFactors = F)#不以因子变量读取
options(scipen = 20)#不以科学计数法显示
library(data.table)
library(tinyarray) 
data<-data.table::fread("GSE104171_NormalizedMatrix.txt.gz",
                        data.table = F) 
data=data[!duplicated(data$V1),]
mat<-data[,c( 2:ncol(data))]
rownames(mat)=data[,1]
mat[1:4,1:4]
keep_feature <- rowSums (mat > 1) > 1 ;table(keep_feature)
ensembl_matrix <- mat[keep_feature, ]  
rownames(ensembl_matrix)=rownames(mat)[keep_feature]
ensembl_matrix[1:4,1:4] 
symbol_matrix=ensembl_matrix
symbol_matrix[1:4,1:4] 
colnames(symbol_matrix)

library(AnnoProbe)
head(rownames(symbol_matrix))
ids=annoGene(rownames(symbol_matrix),'SYMBOL','human')
head(ids)
tail(sort(table(ids$biotypes)))
ids=ids[ids$biotypes=='protein_coding',]
symbol_matrix=symbol_matrix[rownames(symbol_matrix) %in% ids$SYMBOL,]
colnames(symbol_matrix) 
boxplot(symbol_matrix[,1:4])
cor_gene<-c('CD2','CD3E','CD3D','TBX21','CD8B','PRF1',
            'GZMA','GZMB','ITGAM','ARG1','CYBB','OLR1',
            'FUT4','CEACAM8','S100A8','S100A9')
exprSet=symbol_matrix[cor_gene,]

可以看到,是16个基因在74个样品的表达量矩阵:

我们首先呢,使用pheatmap绘图 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

p1=pheatmap::pheatmap(cor(t(exprSet)))
matrix_chosen<-t(scale(t(exprSet)))
tmp<-colnames(matrix_chosen)
tmp<-rep('',ncol(matrix_chosen))
p2=pheatmap::pheatmap(matrix_chosen,labels_col=tmp,
                   legend_breaks=seq(-3,3,1))
hc=cutree(p2$tree_col,2)
# MN-MDSC signature genes (ITGAM, ARG1, CYBB, OLR1, FUT4, CEACAM8, S100A8, and S100A9) 
# cytotoxic lymphocyte signature genes (CD2, CD3E, CD3D, TBX21, CD8B, PRF1, GZMA, and GZMB) 
ac=as.data.frame(as.character(hc))
rownames(ac)=colnames(matrix_chosen)
p3=pheatmap::pheatmap(matrix_chosen,labels_col=tmp,
                   annotation_col = ac,
                   legend_breaks=seq(-3,3,1))
library(cowplot)
require(ggplotify)
cowplot::plot_grid(as.ggplot(p1) , as.ggplot(p3), ncol=2)

可以看到,比较麻烦的把样品分成了两组:

如果是ggalign就一句话 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

library(ggalign)
ggheatmap(matrix_chosen) +
  scale_fill_viridis_c() +
  hmanno("t") +
  align_dendro(aes(color = branch), k = 2) +
  geom_point(aes(color = branch, y = y)) +
  scale_color_brewer(palette = "Dark2")

同样的可以把样品分成两组:

ggalign通过对齐多个ggplot2图表的观测来组织图表布局。它使你能够使用熟悉的 ggplot2 语法创建复杂热图。

安装

你可以使用以下命令从 CRAN 安装 ggalign

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
install.packages("ggalign")

或者,从 GitHub 安装开发版本(目前开发版本添加了大量新功能,因为CRAN通常需要1-2个月的更新间隔,暂不能推送到CRAN):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# install.packages("remotes")
remotes::install_github("Yunuuuu/ggalign")

基本流程

如果你熟悉 ggplot2 语法,ggalign 的使用很简单,典型的工作流程如下:

  • 使用 ggheatmap()ggstack() 初始化布局。
  • 使用以下自定义布局:
    • align_group():将布局轴分组到具有组变量的面板中。
    • align_kmeans():通过 kmeans 将布局轴分组到面板中。
    • align_order():根据统计权重重新排序布局观察结果,或手动指定观察索引。
    • align_dendro():根据层次聚类重新排序或分组布局。
  • 使用 ggalign()ggpanel() 添加图表,然后叠加额外的 ggplot2 元素,如 geoms、stats 或 scales。

基本示例

下面,我们将通过一个基本示例,展示如何使用 ggalign 创建带有 dendrogram 的热图。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
library(ggalign)
set.seed(123)
small_mat <- matrix(rnorm(81), nrow = 9)
rownames(small_mat) <- paste0("row", seq_len(nrow(small_mat)))
colnames(small_mat) <- paste0("column", seq_len(ncol(small_mat)))

# 初始化热图布局,我们可以将其视为一个普通的 ggplot 对象
ggheatmap(small_mat) + 
    # 我们可以直接修改 geoms、scales 和其他 ggplot2 组件
    scale_fill_viridis_c() +
    # 在顶部添加注释
    hmanno("top") +
    # 在顶部注释中,我们添加了一个树状图,并将观察结果分成 3align_dendro(aes(color = branch), k = 3) +
    # 在树状图中添加点 geom
    geom_point(aes(color = branch, y = y)) +
    # 更改树状图的颜色映射
    scale_color_brewer(palette = "Dark2")

与其他 ggplot2 热图扩展比较

ggalign 相对于其他扩展如 ggheatmap 的主要优势在于其与 ggplot2 语法的完全兼容性。你可以无缝使用任何 ggplot2 geoms、stats 和 scales 来构建复杂布局,包括垂直或水平排列的多个热图。

与 ComplexHeatmap 比较

优点

  • ggplot2 生态系统完全集成。
  • 热图注释轴和图例自动生成。
  • 树状图可以轻松自定义和着色。
  • 对图表大小和间距有灵活的控制。
  • 可以通过面板区域轻松与其他 ggplot2 图表对齐。
  • 可以轻松扩展用于其他聚类算法或注释图表。

缺点

内置注释较少:与 ComplexHeatmap 中广泛的内置注释函数相比,可能需要额外编写更多代码以实现特定图形。

更复杂的示例

以下是使用 ggalign 进行的一些更高级的可视化示例:

热图-布局控制

heatmap_layout()/ggheatmap函数用来初始化热图布局

输入数据

数据输入可以是数值或字符向量、数据框,以及任何可以转换为矩阵的数据。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
set.seed(123)
small_mat <- matrix(rnorm(81), nrow = 9)
rownames(small_mat) <- paste0("row", seq_len(nrow(small_mat)))
colnames(small_mat) <- paste0("column", seq_len(ncol(small_mat)))
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
library(ggalign)
ggheatmap(small_mat)

热图

对于 ggplot2,矩阵在绘制时会被转换为长格式的数据框。默认的映射将使用 aes(.data.x, .data.y),但可以通过 mapping 参数进行控制。ggplot2 对象的数据包含以下列:

  • .xpanel.ypanel: 列和行的panel groups
  • .x.y: x 和 y 坐标
  • .row_names.column_names: 原始矩阵的行和列名(仅在名称存在时出现)
  • .row_index.column_index: 原始矩阵的行和列索引。
  • value: 实际的矩阵值。

我们可以像处理普通的 ggplot2 对象一样处理 ggheatmap() 对象,例如添加 ggplot2 geoms, stats, scales以及theme。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ggheatmap(small_mat) + geom_point() + scale_fill_viridis_c()

默认情况下,我们会添加热图层。如果设置 filling = FALSE,则会绘制一个空白的热图。你可以自定义热图图层,对于大数据集,你可以将图层像素化从而提高渲染速度,这里我们使用ggrastr来像素化图层。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ggheatmap(small_mat, filling = FALSE) +
  ggrastr::rasterize(geom_tile(aes(fill = value)))

热图注释

热图注释可为热图的行或列提供额外信息,可以放置在热图四周。ggheatmap()使用活动上下文来控制注释信息的位置。默认情况下,ggheatmap()不会初始化活动上下文,因此所有添加的内容(包括ggplot2元件)都将直接添加进热图主体。您可以使用 hmanno() 来设置活动上下文

除了ggplot2元件外,我们还可以在注释中添加任何align_*()函数,align_*()函数可以添加图表,也可以自定义布局,例如排序,聚类,分组等。目前,有四个 align_* 函数可用于图表布局控制:

  • align_group:根据分类因子对图表进行分组和对齐。
  • align_order:根据统计权重重新排序布局观察值,或允许根据用户定义的标准手动重新排序。
  • align_kmeans:根据 k-means 聚类结果排列图表。
  • align_dendro:根据层次聚类或树状图对图表进行对齐。

align_group

align_group() 函数将行/列进行分组。它不会添加任何绘图区域。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ggheatmap(small_mat) +
    hmanno("t") +
    align_group(sample(letters[1:4], ncol(small_mat), replace = TRUE))

默认情况下,ggplot2面板标题会被移除。您可以使用 theme(strip.text = element_text()) 来选择在那个绘图区域添加facet标题。由于 align_group() 不创建新图表,因此面板标题只能添加到热图中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ggheatmap(small_mat) +
    theme(strip.text = element_text()) +
    hmanno("l") +
    align_group(sample(letters[1:4], nrow(small_mat), replace = TRUE))

align_order

align_order() 函数可对行/列进行排序。像 align_group() 一样,它不会增加绘图区域。

在这里,我们根据均值重新排序行。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ggheatmap(small_mat) +
    hmanno("l") +
    align_order(rowMeans)

此外,我们可以直接提供排序的索引(数值/字符)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
my_order <- sample(nrow(small_mat))
print(rownames(small_mat)[my_order])
#> [1] "row3" "row1" "row7" "row6" "row2" "row8" "row9" "row5" "row4"
ggheatmap(small_mat) +
    hmanno("l") +
    align_order(my_order)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ggheatmap(small_mat) +
    hmanno("l") +
    align_order(rownames(small_mat)[my_order])

默认情况下,align_order() 会根据函数的输出结果(对于行,从底部到顶部;对于列,从左到右)按升序重新排序行或列。可以通过 reverse = TRUE反转顺序:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ggheatmap(small_mat) +
    hmanno("l") +
    align_order(rowMeans, reverse = TRUE)

一些 align_* 函数接受 data 参数。如果 data 参数为 NULL,函数将使用布局的默认数据,如前例所示。data 参数还可以接受一个函数(支持 lambda 语法),该函数将应用于布局数据。

需要注意的是,所有 align_* 函数都将行视为观测。这意味着 NROW(data) 必须与特定的 layout 轴返回相同的观测数。

heatmap_layout()/ggheatmap():对于列注释,layout 数据将在使用转置t(如果数据是 function,它将应用于转置后的矩阵)。因为列注释使用热图列作为观察值,但我们需要行。

因此,即使是顶部和底部注释,我们也可以使用 rowMeans() 计算所有列的平均值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ggheatmap(small_mat) +
    hmanno("t") +
    align_order(rowMeans)

align_kmeans

align_kmeans() 函数根据 k-means 聚类对热图行或列分组,它也不会增加绘图区域。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ggheatmap(small_mat) +
    hmanno("t") +
    align_kmeans(3L)

align_dendro

align_dendro() 函数可以根据层次聚类重新排序或分割布局,同时它也可添加树状图。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ggheatmap(small_mat) +
    hmanno("t") +
    align_dendro()

树状图也可以用来将列/行切割成组。您可以指定 kh,其工作原理等同于于 cutree()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ggheatmap(small_mat) +
    hmanno("t") +
    align_dendro(k = 3L)

align_group()align_kmeans()align_order() 不同,align_dendro() 可添加绘制图区域,我们可对其添加其他图层。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ggheatmap(small_mat) +
    hmanno("t") +
    align_dendro() +
    geom_point(aes(y = y))

align_dendro() 函数为 ggplot 创建了默认的 node 数据。有关详细信息,请参见 ?align_dendro 中的 ggplot2 specification。此外,edge 数据直接添加到 ggplote::geom_segment()图层中,用于绘制树状图。nodeedge 数据中的有一个branch 列,对应于 cutree 结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ggheatmap(small_mat) +
    hmanno("t") +
    align_dendro(aes(color = branch), k = 3) +
    geom_point(aes(color = branch, y = y))

通过设置reorder_dendrogram参数align_dendro()可以根据观测均值对聚类树进行重排,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
h1 <- ggheatmap(small_mat) +
    hmanno("t") +
    align_dendro(aes(color = branch), k = 3, reorder_dendrogram = TRUE) +
    ggtitle("reorder_dendrogram = TRUE")
h2 <- ggheatmap(small_mat) +
    hmanno("t") +
    align_dendro(aes(color = branch), k = 3) +
    ggtitle("reorder_dendrogram = FALSE")
align_plots(h1, h2)

align_dendro() 函数还可以在组内进行聚类,这意味着即使在布局中存在现有的组,也可以使用它:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
column_groups <- sample(letters[1:3], ncol(small_mat), replace = TRUE)
ggheatmap(small_mat) +
    hmanno("t") +
    align_group(column_groups) +
    align_dendro(aes(color = branch))

您可以通过设置 reorder_group = TRUE 对组进行重新排序。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ggheatmap(small_mat) +
    hmanno("t") +
    align_group(column_groups) +
    align_dendro(aes(color = branch), reorder_group = TRUE)

您可以通过设置 merge_dendrogram = TRUE 合并每个组中的子树。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ggheatmap(small_mat) +
    hmanno("t") +
    align_group(column_groups) +
    align_dendro(aes(color = branch), merge_dendrogram = TRUE)

您可以同时排序以及合并树状图。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ggheatmap(small_mat) +
    hmanno("t") +
    align_group(column_groups) +
    align_dendro(aes(color = branch),
        reorder_group = TRUE,
        merge_dendrogram = TRUE
    ) +
    hmanno("b") +
    align_dendro(aes(color = branch),
        reorder_group = FALSE,
        merge_dendrogram = TRUE
    )

感兴趣更多细节的小伙伴务必去看看:https://yunuuuu.github.io/ggalign/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-10-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信技能树 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
人工智能大模型不会告诉你的热图绘制技巧
习惯了在做生物信息学数据分析或者相关知识点整理之前,都下意识的问一下人工智能大模型,比如关于热图的绘制,大模型其实是会优先推荐ggplot2,但是对绝大部分小伙伴来说,不如pheatmap那样的入手简单!
生信技能树
2024/11/21
1800
人工智能大模型不会告诉你的热图绘制技巧
六分组疾病进展的关键基因差异箱线图绘制
我们每一次的绘图不光光只有绘图的技巧,还带有对文章提供的原始数据处理小技巧,大家可不要忽略了这个呀!还有图和数据在这篇文章中的应用,都是可以学习的!
生信技能树
2025/02/20
980
六分组疾病进展的关键基因差异箱线图绘制
带有疾病进展的多分组差异结果如何展示?
此次给绘制的图来自文献《Triple DMARD treatment in early rheumatoid arthritis modulates synovial T cell activation and plasmablast/plasma cell differentiation pathways》,是2017发表的,使用了他们团队自己2016发表的转录组测序数据,所以其实是有两个转录组测序数据集。
生信技能树
2025/01/02
1950
带有疾病进展的多分组差异结果如何展示?
ggtree-给你的进化树盛世美颜
ggtree是ggplot2的拓展包,可以应用于进化树的绘制,还能对进化树丰富的注释分析。
作图丫
2022/03/29
12.4K0
ggtree-给你的进化树盛世美颜
R tips:ggplot2进行多维原位图绘制
R中可以使用ggplot2的geom_tile图层绘制热图,可是有的时候我们想要每一个热图格子里面可以展示多维的信息:多个基因表达量、多个组别数据等等,而不是一个热图仅展示了一个表达量信息。本文可以解决这个需求。
生信菜鸟团
2025/01/07
1290
R tips:ggplot2进行多维原位图绘制
热图到底是横向基因层面归一化还是依据纵向的样品呢?
在(Gene Expression Omnibus, GEO)中,可以通过提供的访问号码GSE200033和GSE200226获取这两个数据集的表达量矩阵。
生信技能树
2024/11/21
1060
热图到底是横向基因层面归一化还是依据纵向的样品呢?
R包:ggalign调整和组合多个图形的R包
这个包扩展了ggplot2,提供了用于对齐和组织多个图的高级工具,特别是那些自动重新排序观察结果的工具,比如树形图。它提供了对布局调整和情节注释的精细控制,使您能够创建复杂的、出版质量的可视化,同时仍然使用熟悉的ggplot2语法。
生信学习者
2025/02/25
2750
R包:ggalign调整和组合多个图形的R包
顶刊杂志Nat Med.(IF=58.7)同款GSVA打分结果可视化
这个打分的双向条形图我印象中最深的是他出现在2018年8月24发表在顶刊杂志Nat Med.(IF=58.7)中,文献的标题为《Phenotype molding of stromal cells in the lung tumor microenvironment》,长得很好看:
生信技能树
2025/04/01
2190
顶刊杂志Nat Med.(IF=58.7)同款GSVA打分结果可视化
R语言绘制圈图、环形热图可视化基因组实战:展示基因数据比较
heatmap()的输入应该是一个矩阵(或者一个将被转换为单列矩阵的向量)。如果矩阵被分割成组,必须用split参数指定一个分类变量。注意spilt的值应该是一个字符向量或一个因子。如果它是一个数字向量,它将被转换为字符。
拓端
2021/09/29
5.4K0
pheatmap 排序
hclust 的顺序是靠order 和 labels 两个数据控制,labels 是有顺序的名称,其座次可以被索引提取。order
花落花相惜
2021/12/06
1.4K0
数据处理基础—ggplot2了解一下
ggplot2是由Hadley Wickham设计的R软件包,它有助于数据绘图。在本实验中,我们将简要介绍该软件包的一些功能。如果您想了解更多关于如何使用ggplot2的信息,我们建议您阅读Hadley Wickham撰写的“ggplot2 Elegant graphics for data analysis”。
生信技能树jimmy
2020/03/31
1.7K0
数据处理基础—ggplot2了解一下
「Workshop」第十五期:热图
https://www.bilibili.com/video/BV1Pa4y1E7WS
王诗翔呀
2022/01/21
1.8K0
「Workshop」第十五期:热图
生信技能树GEO数据挖掘直播配套笔记
二代测序(RNA_seq):如果是counts 可选择limma的voom算法或者edgeR或者DESeq2。 如果是FPKM或TPM可选择limma,注意:edgeR和DESeq2只能处理count注意:count做差异分析计算上下调,FPKM或TPM进行下游可视化
生信技能树
2022/06/08
2K0
生信技能树GEO数据挖掘直播配套笔记
GEO表达芯片数据分析
---title: "GEO表达芯片数据分析"output: html_documentdate: "2023-03-20"---关于该流程代码的说明:(1)本流程仅适用于GEO芯片表达数据,以"GSE56649"为例(2)先在GEO数据库中确定是否为"Expression profiling by array",不是的话不能使用本流程!(3)注意需要自行修改或判断的代码一般放在了两个空行之间(4)代码的注释有一丢丢多,目的是为了更好地帮助大家理解1.下载数据,提取表达矩阵、临床信息和GPL编号rm(lis
小叮当aka
2023/03/23
3.3K1
技术贴:R语言拼图全面介绍
说起R语言的拼图,可能大家一点都不陌生,比如常用的“cowplot”和“patchwork”。gridExtra包也提供了一个拼图函数”grid.arrange“。另外,南方医科大学余光创教授也开发了一个更为神奇的拼图R包:aplot。本文将依次对它们的用法进行介绍。
作图丫
2022/03/29
6K0
技术贴:R语言拼图全面介绍
ggplot2版本的热图-方便拼图!
之前写了8篇推文详细介绍了complexheatmap画热图,大家可以在公众号后台搜索即可看到!
医学和生信笔记
2022/11/15
2.4K1
ggplot2版本的热图-方便拼图!
R语言ggplot2:单元格为方块的热图简单小例子-2
昨天公众号后台有人留言作图,示例图如下 image.png 我选择使用R语言的ggplot2来实现,这个是箱线图和热图的拼接,右侧的热图可以借助geom_point()函数实现,将点的形状改为正方块,
用户7010445
2021/04/21
3.3K0
R语言ggplot2:单元格为方块的热图简单小例子-2
全网最全的R语言基础图形合集
直方图是一种对数据分布情况进行可视化的图形,它是二维统计图表,对应两个坐标分别是统计样本以及该样本对应的某个属性如频率等度量。
生信学习者
2024/06/12
1190
全网最全的R语言基础图形合集
多分组表达量矩阵的层次聚类和组合pca分析
上面的结果通常是ensembl数据库的id,需要转换为人类可以看得懂的symbol名字。
生信菜鸟团
2024/04/30
4920
多分组表达量矩阵的层次聚类和组合pca分析
表达芯片数据分析3——基因差异分析绘制火山图及差异基因热图
Erics blog
2023/10/02
7431
推荐阅读
相关推荐
人工智能大模型不会告诉你的热图绘制技巧
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验