【问题标题】:How do I plot dendrogram alongside distance matrix in R?如何在 R 中沿着距离矩阵绘制树状图?
【发布时间】:2020-10-17 08:27:30
【问题描述】:

我正在寻找一种有效的方法来绘制从数据中获得的树状图,但在相应的距离矩阵而不是原始数据旁边。我一直很好奇不同的论文如何展示这一点,似乎他们所做的只是分别绘制热图和树状图并在图像编辑软件中处理它们。希望下面的代码能清楚地说明我想要什么。 假设我生成以下数据并使用 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

现在我可以绘制相应的距离矩阵,按 Fig1 中的树状图对其行和列进行排序:

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()。有没有办法使用 ggplot2 做我想做的同样的事情?

【问题讨论】:

    标签: r ggplot2 heatmap gplots


    【解决方案1】:

    关于在 ggplot2 中执行此操作;我在某个时候写了一个函数来帮助解决这个问题,尽管它并非没有缺陷。它需要一个hclust 对象并使用它来绘制一个树状图作为轴指南。首先,我们将从您之前的热图中获取树状图。

    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 对象,然后我们将其输入到秤中。尺度应该(理论上)根据聚类自动对变量进行排序。

    我只是在情节的每一边添加树状图,所以你可以选择你真正想要的。

    # 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()
    

    需要注意的是,目前还没有对标签的良好控制。如果您在使用该功能时遇到任何问题,请告诉我,以便我改进。

    祝你好运!

    【讨论】:

      猜你喜欢
      • 2017-05-15
      • 2018-02-25
      • 2020-02-17
      • 2010-10-17
      • 1970-01-01
      • 2012-11-10
      • 2022-01-12
      • 2014-04-15
      相关资源
      最近更新 更多