R 数据可视化 —— 聚类热图 pheatmap

R 数据可视化 —— 聚类热图 pheatmap,第1张

在前面的章节中,我们介绍了如何使用 ggplot2 绘制热图

ggplot2 绘制热图的方式很多,如 geom_raster 、 geom_tile 等

但通常仅仅绘制热图是不够的,还需要对数据进行聚类,即绘制聚类热图。

例如,最常用的就是将差异基因的表达值绘制聚类热图,来查看基因在不同样本中的表达差异情况,或者比较不同聚类分组之间的差异。

绘制聚类热图的包有很多,我们主要介绍 pheatmap 和 ComplexHeatmap

假设我们有如下数据

要绘制简单的热图,可以使用内置的 heatmap 函数

更改颜色,并为列添加列样本的分类颜色条

内置函数提供的样式较少,无法对某些图形属性进行设置。

所以下面我们使用 pheatmap 包来绘制热图

pheatmap 对图形属性提供了更精细的控制

这样看起来怪怪的,应该是基因的表达量差异,所以对行进行标准化

嗯,一下子就顺眼多了,实验组和对照组的基因表达量差别明显

默认情况下,会对数据的行列分别进行层次聚类,如果我们想在进行层次聚类之前,先对行特征,也就是基因进行 k-means 聚类,我们可以

先将基因聚为 3 类,再进行层次聚类

如果只想对其中行列中的一个进行聚类,可以使用 cluster_rows 和 cluster_cols 参数,取消对行或列的距离

默认的距离度量为欧氏距离,也可以分别为行列指定不同的距离度量,例如

也可以使用 clustering_method 参数来指定不同的聚类方法,支持以下几种方法:

图例的设置很简单,即通过 legend_breaks 参数设置断点, legend_labels 参数设置断点处的标签

如果不想显示图例,直接设置 legend = F 就行

设置边框颜色

删除边框

默认情况下,单元格的长度和宽度会根据的大小自动调整,如果想固定单元格的大小,可以使用 cellwidth 和 cellheight 两个参数

如果我们想在单元格中显示对于的数值,可以设置 display_numbers = TRUE

对显示的数值进行格式化

或者,为 display_numbers 参数传递一个矩阵

例如,根据表达值是否大于 100 来显示不同的标记

在不对数据进行聚类的情况下,可以对行列进行自定义划分为不同的块

或者只对行或列进行分块

总之,只能对未聚类的行或列进行分块

或者,根据层次聚类的结果,对数据进行分块

使用 main 参数来设置图像的标题

可以使用 show_colnames 和 show_rownames 不显示标签

分别设置标签的大小,同时设置列标签的倾斜角度,可选的角度有 270、0、45、90、315

也可以使用 fontsize 参数统一行列标签的大小

也可以自定义行列标签

我们可以分别为行和列构建分组信息,例如对于行是基因,可以将其分为癌基因和抑癌基因等,而列为样本可以分为癌症和配对正常样本,同时样本对应的患者应该会有年龄性别等信息

例如

我们可以将这些信息以颜色条的方式添加到图中

隐藏图例

我们可以回去 pheatmap 函数返回的对象的信息

可以看到,返回对象 p 中包含 4 个变量,我们可以根据 tree_row 和 tree_col 提取出对应的行列顺序

提取这些信息有助于我们对数据进行分组,用于后续分析

参数列表

数据:
>R语言绘制二元聚类图
说明
之前使用k均值方法将数据划分到不同的簇中,但当变量个数大于2时,就无法在二维空间中展示数据聚类的过程,因此可以使用二元聚类图先将变量减少成两个主要成分,然后利用组件(诸如轴线和椭圆)来展示数据聚类的结果。
*** 作
载入包,绘制二元聚类图
library("cluster")
clusplot(customer,fit$cluster,color = TRUE,shade = TRUE)
二元聚类图
对二元聚类图进行标记并放大:
par(mfrow = c(1,2))
clusplot(customer,fit$cluster,color = TRUE,shade = TRUE)
rect(-07,-17,22,-12,border = "orange",lwd = 2)
clusplot(customer,fit$cluster,color = TRUE,xlim = c(-07,22),ylim =c(-17,-12))
原理
本节绘制了一个二元聚类图以展示数据聚类的过程,我们首先安装和导入cluster算法包,然后使用clusplot函数绘制customer数据集的二元聚类图,clusplot函数的shade和color参数值均被设置成TRUE,得到一个彩色且带边框的聚类。 在得到的结果图中,可以得知二元聚类使用了两个成分,x轴与y轴涵盖了8501%的数据点,数据点根据成分1和成分2的取值散落在图中,同一簇内的数据点采用相同的颜色和形状绘制。
我们还使用了rect函数来增加一个矩形框对给定x轴和y轴内的簇进行特别标注,然后调用clusplot函数,设置好xlim与ylim参数的值,将被选中的簇放大到显示以便不好的观测簇内数据点的特征。

1所有在对iris数据集分(聚)类研究中,setosa均可以完全正确分(聚)类,而另外两类则会出现不同程度的误差,这也是导致整个研究模型出现误差的原因;
2在使用的三种分类研究方法中,决策树模型的效果最优,因此可以使用该方法进行鸢尾花数据集的分类预测研究。

1在对鸢尾花数据集进行聚类时,K-means、K-medoids两种聚类方法的正确率相同,可见在数据集离群点和噪音不大的情况下,二者聚类效果基本相同,但当出现离群点和噪音时,应该考虑K-medoids聚类方法;
2鸢尾花数据集进行聚类分析时,划分聚类效果优于层次聚类;
3对于量纲不一致的数据,应进行标准化,但对于量纲一致的数据,标准化之后结果并不一定优于未标准化的数据得到的结果。

那么圆形的树状图如何实现呢?我查找了一下相关资料。
R语言包 dendextend 这个包可以实现,利用 help(package="dendextend") 查看帮助文档,能够看到其中的一个小例子

但是这个后期美化起来好像不太方便。

还找到了一个参考链接是
>

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/13375253.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-24
下一篇 2023-07-24

发表评论

登录后才能评论

评论列表(0条)

保存