聚類分析作圖往往包含熱圖(heatmap)和樹狀圖(dendrogram)。熱圖用來展示每個樣本點數值大小和聚集模式。樹狀圖用來表示樣本之間以及變量之間的距離遠近(或者相似性大小)。R官網目前提供了至少45個可以繪制熱圖的包(packages),其中比較常見的、可以添加行列注釋信息條的聚類作圖包有pheatmap、gplots等等。以下簡單介紹一下對熱圖(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)#畫圖
結果如下圖:
樹狀圖+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="")
結果如下圖:
另:有時候數據量非常大,樣本名稱疊加到一起會糊成一片,導致看不清楚。不如去掉樣本名稱,代碼如下:
#畫圖
par(mar = c(12,4,1,1))
labels(dend) <- ""
plot(dend)
colored_bars(col_car_type,dend,rowLabels="")
結果如下圖所示:
參考資料:
[1] Frequently asked questions
[2] Hierarchical cluster analysis on famous data sets - enhanced with the dendextend package