簡體   English   中英

如何在 R 中與距離矩陣一起 plot 樹狀圖?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM