[英]How do I plot dendrogram alongside distance matrix in R?
我正在尋找一種有效的方法來 plot 從數據中獲得的樹狀圖,但在相應的距離矩陣而不是原始數據旁邊。 我一直很好奇不同的論文如何展示這一點,似乎他們所做的只是將熱圖和樹狀圖分開處理,並在圖像編輯軟件中處理它們。 希望下面的代碼能清楚地說明我想要什么。 假設我生成以下數據並使用 Pearson 相關性作為距離度量並使用完整鏈接作為聚類來獲得層次聚類:
library(gplots)
set.seed(2)
x <- matrix(rnorm(100), nrow = 5)
dist.fn <- function(x) as.dist(1-cor(t(x)))
hclust.com <- function(x) hclust(x, method="complete")
h.ori <- heatmap.2(x, trace="none", distfun=dist.fn, hclustfun=hclust.com,dendrogram = "row",main = "Fig1")
h.ori$rowInd
# 1 3 5 4 2
現在我可以 plot 對應的距離矩陣按圖 1 中的樹狀圖對其行和列進行排序:
colfunc <- colorRampPalette(c("red", "white", "yellow")) #not really necessary
dmat <- cor(t(x))[h.ori$rowInd,h.ori$rowInd]
heatmap.2(dmat,Rowv = NULL,Colv = "Rowv",scale = 'none',
dendrogram='none',trace = 'none',density.info="none",
labRow = h.ori$rowInd, labCol = h.ori$rowInd,
col=colfunc(20))
這是我的問題:如何將 Fig1 中繪制的樹狀圖添加到 Fig2 中的樹狀圖(最好同時沿列和行)? 目的是查看樹狀圖產生的聚類,對於塊模型,這將是一種很好的可視化方式。 另外作為一個附帶問題,我知道如何使用ggplot2庫(即使用geom_tile() ) plot 熱圖。 有沒有辦法使用ggplot2做我想做的同樣的事情?
關於在 ggplot2 中執行此操作; 我在某個時候寫了一個 function 來幫助解決這個問題,盡管它並非沒有缺陷。 它采用hclust
object 並將其用於 plot 的樹狀圖作為軸指南。 首先,我們將從您之前的熱圖中獲取樹狀圖。
library(gplots)
#> Warning: package 'gplots' was built under R version 4.0.2
#>
#> Attaching package: 'gplots'
#> The following object is masked from 'package:stats':
#>
#> lowess
library(ggplot2)
library(ggh4x)
set.seed(2)
x <- matrix(rnorm(100), nrow = 5)
dist.fn <- function(x) as.dist(1-cor(t(x)))
hclust.com <- function(x) hclust(x, method="complete")
h.ori <- heatmap.2(x, trace="none", distfun=dist.fn, hclustfun=hclust.com,dendrogram = "row",main = "Fig1")
h.ori$rowInd
#> [1] 1 3 5 4 2
然后我們將其格式化為hclust
object,然后我們將其輸入到秤中。 尺度應該(理論上)根據聚類自動對變量進行排序。
我只是在 plot 的每一側添加樹狀圖,所以你可以選擇你真正想要的。
# Plot prep: making the distance and hclust objects
clust <- as.hclust(h.ori$rowDendrogram)
df <- reshape2::melt(cor(t(x)))
ggplot(df, aes(Var1, Var2, fill = value)) +
geom_raster() +
scale_fill_gradient2(low = "red", mid = "white", high = "yellow")+
scale_x_dendrogram(hclust = clust) +
scale_y_dendrogram(hclust = clust) +
guides(
x.sec = guide_dendro(dendro = ggdendro::dendro_data(clust), position = "top"),
y.sec = guide_dendro(dendro = ggdendro::dendro_data(clust), position = "right")
) +
coord_equal()
需要注意的是,目前還沒有對標簽的良好控制。 如果您在使用 function 時遇到任何問題,請告訴我,以便我改進。
祝你好運!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.