如何在 R 中绘制树状图和距离矩阵?

How do I plot dendrogram alongside distance matrix in R?

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

现在我可以绘制相应的距离矩阵,按照图 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))

我的问题是:如何将图 1 中绘制的树状图添加到图 2 中的树状图(最好同时沿着列和行)?目的是查看树状图生成的聚类,对于 Block 模型,这将是一种很好的可视化方式。 另外作为附带问题,我知道如何使用 ggplot2 库绘制热图,即使用 geom_tile()。有没有办法使用 ggplot2 来做我想做的事情?

关于在 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()

需要注意的是,目前还没有很好地控制标签。如果您 运行 对该功能有任何问题,请告诉我,以便我改进它。

祝你好运!