R中热图聚类那些事

科技   2024-09-13 09:31   陕西  

欢迎关注R语言数据分析指南

本节来介绍一下热图绘制过程中聚类分析的情况,通过两组代码来进行介绍并绘图展示。数据为随意构建,图形无实际意义仅做绘图展示,代码仅供参考。数据会上传到交流群,购买过小编绘图文档的朋友可在所加的交流群内获取下载,有需要的朋友可关注文末介绍购买小编的R绘图文档。购买前请咨询,零基础不要买

加载R包

library(tidyverse)
library(MetBrewer)
library(pheatmap)
library(ggdendro)
library(patchwork)
library(ape)
library(ggtree)
library(aplot)

pheatmap绘制热图

df <- reggtreedf <- read_tsv("heatmap.tsv") %>% column_to_rownames(var="sample")

plot1 <- pheatmap(df, scale = "none",
cluster_row = TRUE, cluster_col = TRUE, border = NA,
fontsize_number = 12, number_color = "white",
fontsize =8,
cellwidth = 13, cellheight =12)

ggplot绘制热图

plot <- df %>% 
rownames_to_column(var="sample") %>%
pivot_longer(-sample) %>%
ggplot(aes(y=sample,x=name))+
geom_tile(color="black",aes(fill=value)) +
scale_y_discrete(position = "right")+
scale_x_discrete(expand = c(0,0))+
scale_fill_gradientn(colors=met.brewer("Cassatt1"),na.value = NA)+
labs(x=NULL,y=NULL)+
coord_cartesian(clip = "off")+
theme(axis.text.x = element_text(color="black",size=8,angle=60,vjust=1,hjust=1),
axis.text.y=element_text(color="black",size=8,hjust=0),
plot.margin=unit(c(0,0.5,0.5,0),unit="cm"),
plot.background = element_blank(),
panel.background = element_blank(),
axis.ticks = element_blank(),
legend.text = element_text(color="black"),
legend.title.position = "left",
legend.title=element_text(angle = 90,hjust=0.5))
# 行聚类
hr <- hclust(dist(df,method = "euclidean"),method = "complete") %>%
ggtree(.,layout = "rectangular",branch.length = "none")
# 列聚类
hc <- hclust(dist(t(df),method = "euclidean"),method = "complete") %>%
ggtree(.,layout = "rectangular",branch.length = "none")+
layout_dendrogram()
# 拼图
plot %>% insert_top(hc,height=0.4) %>%
insert_left(hr,width=0.15)

由于pheatmap会根据聚类结果自动调整树状图的比例和结构,所以二者略有不同。

•距离度量(dist()):pheatmap 默认使用的是欧氏距离 ("euclidean")。
•聚类方法(hclust()):pheatmap 默认使用完全连接法 ("complete").

在层次聚类(hclust)中,使用 dist(dff, method = "euclidean") 和 hclust(..., method = "complete") 是为了指定两部分内容:

1.euclidean(欧氏距离):
• 距离度量:这是用来计算样本之间的距离(相似性)的度量方法。欧氏距离是最常用的距离度量之一,适用于数值型数据。欧氏距离计算两个点之间的直线距离(即,几何上的直线距离)。欧氏距离的计算公式如下(假设有两个点 x 和 y,每个点有 n 个特征):

欧氏距离适用于数值型数据,能够反映样本在多维空间中的几何距离。对于聚类分析来说,距离越小表示两个样本越相似。

2.complete(完全连接法):
• 聚类方法:hclust 中的 method = "complete" 指的是完全连接法(也叫最长距离法),它是用来合并聚类的算法。在层次聚类过程中,complete 方法计算的是两个簇之间最远的点之间的距离,并将簇与最大距离最短的两个簇合并。它确保簇内部的所有点之间的距离都不会过大,因此最终得到的簇是相对紧密的。层次聚类的常见方法有:
• complete(完全连接法):使用簇之间最远的点之间的距离。
• single(单连接法):使用簇之间最近的点之间的距离。
• average(平均连接法):使用簇之间所有点的平均距离。
• ward.D2(Ward’s最小方差法):通过最小化各簇内部的方差来合并簇。
完全连接法倾向于生成较为紧密的簇,它对离群点更为敏感,但能够避免生成过长和稀疏的簇。

为什么选择 euclidean 和 complete
• 欧氏距离(euclidean):适用于大多数数值型数据,能够很好地衡量样本之间的几何距离。如果你的数据维度较少且代表了不同变量的具体数值特征,欧氏距离是一个常见且合理的选择。
• 完全连接法(complete):这种聚类方法倾向于形成紧密的簇,避免单个簇内包含过大的变异性。它在很多场景下会比单连接法生成的簇更加平衡和紧凑,尤其适合希望将相似样本紧密聚合在一起的情况。

何时选择其他距离度量和聚类方法?

• 距离度量:
• 如果数据是非数值型(例如,分类变量),可以考虑使用曼哈顿距离(manhattan)或其他适合离散数据的距离度量。
• 如果数据具有特殊的结构或非线性特征,可能要选择更加合适的距离度量(如相关系数距离、马氏距离等)。
• 聚类方法:
• 如果你希望簇的定义更加松散(如更关注簇之间最近的样本),可以使用单连接法(single)。
• 如果你希望簇的定义更加基于中心聚集性(如使每个簇内部的方差最小化),可以使用 Ward’s 法(ward.D2)。
• 欧氏距离(euclidean):适用于数值型数据,能够衡量样本之间的几何距离。
• 完全连接法(complete):倾向于生成较紧密的簇,适合避免过于松散或稀疏的聚类结构。

绘制与pheatmap一致的聚类树热图

此段代码主要介绍一种独特的方法,实际中实用性不强,但也不排除在一定的场景下有其用处。主要使用ggdendro包来绘制聚类树并进行细节的调整使其与pheatmap的结果保持一致,最终通过极度严苛的细节调整拼图而成。

# 从phetamp的结果图提取行和列的聚类树
tree_row <- plot1$tree_row
tree_col <- plot1$tree_col

dhc <- as.dendrogram(tree_col)
ddata1<- dendro_data(dhc, type = "rectangle")

hc <- ggplot(segment(ddata1)) +
geom_segment(aes(x = x, y = y, xend = xend, yend = yend))+
# geom_text(data = label(ddata),
# aes(x = x, y = y-0.5, label = label), vjust =0.5,hjust=0,size = 3,angle=-90)+
coord_cartesian(clip = "off")+
scale_x_discrete(expand = c(0.01,0.01))+
theme_void()

# hc <- ggdendrogram(tree_col, rotate = FALSE, size = 2)+
# scale_x_discrete(expand = c(0.01,0.01))+
# theme_void()

dhr <- as.dendrogram(tree_row)
# Rectangular lines
ddata2 <- dendro_data(dhr, type = "rectangle")

hr <- ggplot(segment(ddata2)) +
geom_segment(aes(x = x, y = y, xend = xend, yend = yend))+
# geom_text(data = label(ddata2),
# aes(x = x, y = y-0.5, label = label),
# vjust =0.5,hjust=0,size = 3,angle=0)+
# coord_cartesian(clip = "off")+
coord_flip() +
scale_y_reverse(expand = c(0,0))+
scale_x_reverse(expansion(mult = c(0.15,0.1))) +
theme_void()

dff <- df %>%
rownames_to_column(var="sample") %>%
pivot_longer(-sample)

dff$name <- factor(dff$name,levels = ddata1$labels %>% pull(label))

plot <- dff %>% ggplot(aes(y=sample,x=name))+
geom_tile(color="black",aes(fill=value)) +
scale_y_discrete(position = "right")+
scale_x_discrete(expand = c(0,0))+
scale_fill_gradientn(colors=met.brewer("Cassatt1"),na.value = NA)+
labs(x=NULL,y=NULL)+
coord_cartesian(clip = "off")+
theme(axis.text.x = element_text(color="black",size=8,angle=60,vjust=1,hjust=1),
axis.text.y=element_text(color="black",size=8,hjust=0),
plot.margin=unit(c(0,0.5,0.5,0),unit="cm"),
plot.background = element_blank(),
panel.background = element_blank(),
axis.ticks = element_blank(),
legend.text = element_text(color="black"),
legend.title.position = "left",
legend.title=element_text(angle = 90,hjust=0.5))
# 拼图
p1 <- (hc/plot)+plot_layout(heights = c(0.5,1))
p2 <- (plot_spacer()/hr)+plot_layout(heights = c(0.48,1))
(p2|p1)+plot_layout(widths =c(0.2,1))


关注下方公众号下回更新不迷路

本节介绍到此结束,有需要学习R数据可视化的朋友欢迎到淘宝店铺:R语言数据分析指南,购买小编的R语言可视化文档(2024版),购买将赠送2023年的绘图文档内容。目前此文档(2023+2024)已经更新上传200案例文档,每个案例都附有相应的数据和代码,并配有对应的注释文档,方便大家学习和参考。

2024更新的绘图内容将同时包含数据+代码+注释文档+文档清单,2023无目录仅有数据文件夹,小编只分享案例文档,不额外回答问题,无答疑服务,零基础不推荐买。

案例特点

所选案例图均属于个性化分析图表完全适用于论文发表,内容异常丰富两年累计发布案例图200+,2024年6月起提供html版注释文档更加直观易学。文档累计上千人次购买拥有良好的社群交流体验。

R代码结构清晰易懂,为防止中文乱码提供单独的注释文档

淘宝店铺

2024年已更新案例图展示

2023年案例图展示


R语言数据分析指南
R语言重症爱好者,喜欢绘制各种精美的图表,喜欢的小伙伴可以关注我,跟我一起学习
 最新文章