R语言绘图——层次聚类图及树状图添加side bar

聚类分析作图往往包含热图(heatmap)和树状图(dendrogram)。热图用来展示每个样本点数值大小和聚集模式。树状图用来表示样本之间以及变量之间的距离远近(或者相似性大小)。R官网目前提供了至少45个可以绘制热图的包(packages),其中比较常见的、可以添加行列注释信息条的聚类作图包有pheatmapgplots等等。以下简单介绍一下对热图(heatmap)和树状图(dendrogram)添加注释信息条(side bar)的方法(以mtcars数据集为例)。

树状图+热图+side bar

library(gplots)#导入R包
data(mtcars)#导入示例数据
x <- as.matrix(mtcars)#gplots要求输入numeric matrix,所以要转化为数量矩阵
rc <- rainbow(nrow(x),start=0, end=.3)#用于绘制side bar,给每一个行名赋一种颜色
cc <- rainbow(ncol(x), start=0, end=.3)#用于绘制side bar,给每一个列名赋一种颜色
hv <- heatmap.2(x,RowSideColors=rc, ColSideColors=cc)#画图

结果如下图:

R语言绘图——层次聚类图及树状图添加side bar

树状图+side bar

如果数据量比较大,不想显示热图部分,而只想显示树状图部分,则可以使用dendextend包(仍以mtcars数据集为例)实现。

library(dendextend)#导入R包
data(mtcars)#导入数据
dend <- as.dendrogram(hclust(dist(mtcars)))

# 给每种样本(汽车)赋一种颜色,这里有四种汽车类型
car_type <- rep("Other", length(rownames(mtcars)))
is_x <- grepl("Merc", rownames(mtcars))
car_type[is_x] <- "Mercedes"
is_x <- grepl("Mazda", rownames(mtcars))
car_type[is_x] <- "Mazda"
is_x <- grepl("Toyota", rownames(mtcars))
car_type[is_x] <- "Toyota"
car_type <- factor(car_type)
n_car_types <- length(unique(car_type))
cols_4 <- colorspace::rainbow_hcl(n_car_types, c = 70, l  = 50)
col_car_type <- cols_4[car_type]

#画图
par(mar = c(12,4,1,1))
plot(dend)
colored_bars(col_car_type,dend,rowLabels="")

结果如下图:

R语言绘图——层次聚类图及树状图添加side bar

另:有时候数据量非常大,样本名称叠加到一起会糊成一片,导致看不清楚。不如去掉样本名称,代码如下:

#画图
par(mar = c(12,4,1,1))
labels(dend) <- ""
plot(dend)
colored_bars(col_car_type,dend,rowLabels="")

结果如下图所示:

R语言绘图——层次聚类图及树状图添加side bar

参考资料:
[1] Frequently asked questions

[2] Hierarchical cluster analysis on famous data sets - enhanced with the dendextend package

相关推荐