【问题标题】:Changing branch length in dendrogram (pheatmap)更改树状图中的分支长度(pheatmap)
【发布时间】:2020-04-30 00:09:34
【问题描述】:

我正在尝试使用 R 中的库 pheatmap 绘制热图。 我认为默认情况下,分支长度与在此步骤合并的集群的“差异”成正比。我想碰碰运气,所以它是一个固定值,因为就我的目的而言,它看起来很奇怪!

如果有人知道我该如何解决这个问题,我会非常高兴。

这是一个示例代码

library(pheatmap)
test = matrix(rnorm(6000), 100, 60)
pheatmap(test)

干杯!

【问题讨论】:

  • 非常正确:分支长度表示不同程度。不知道你想改变什么。我怀疑您可以将分支长度设置为“固定值”,因为这与聚类分析的理念背道而驰。就您的数据而言,究竟是什么“看起来很奇怪”?
  • 感谢您确认我对分支长度的假设!简而言之,我要合并的最后两个集群显示出非常高的差异性,导致一个非常长的分支,这真的搞砸了可视化,因为过度的分支非常短
  • 我看不出长度上的差异会如何“搞乱”可视化。你能显示一个屏幕截图吗?除此之外,调整treeheight_colargument 会有所帮助吗?默认为 50;因此,如果要拉长分支,请选择一个 > 50 的值,如果要缩短它们,请选择一个

标签: r dendrogram pheatmap


【解决方案1】:

这是两个高度不同的列组的示例:

library(pheatmap)
test = cbind(matrix(rnorm(3000), 100, 30),
            matrix(rnorm(3000)+10, 100, 30))
pheatmap(test)

TIn pheatmap树形图由pheatmap:::draw_dendrogram 函数绘制 和分支长度存储在 h 对象中。
下面我定义等长分支添加命令
hc$height <- cumsum(rep(1/length(hc$height), length(hc$height)))
如下:

draw_dendrogram <- function(hc, gaps, horizontal = T) {
    # Define equal-length branches
    hc$height <- cumsum(rep(1/length(hc$height), length(hc$height)))
    h = hc$height/max(hc$height)/1.05
    m = hc$merge
    o = hc$order
    n = length(o)
    m[m > 0] = n + m[m > 0]
    m[m < 0] = abs(m[m < 0])
    dist = matrix(0, nrow = 2 * n - 1, ncol = 2, dimnames = list(NULL, 
        c("x", "y")))
    dist[1:n, 1] = 1/n/2 + (1/n) * (match(1:n, o) - 1)
    for (i in 1:nrow(m)) {
        dist[n + i, 1] = (dist[m[i, 1], 1] + dist[m[i, 2], 1])/2
        dist[n + i, 2] = h[i]
    }
    draw_connection = function(x1, x2, y1, y2, y) {
        res = list(x = c(x1, x1, x2, x2), y = c(y1, y, y, y2))
        return(res)
    }
    x = rep(NA, nrow(m) * 4)
    y = rep(NA, nrow(m) * 4)
    id = rep(1:nrow(m), rep(4, nrow(m)))
    for (i in 1:nrow(m)) {
        c = draw_connection(dist[m[i, 1], 1], dist[m[i, 2], 1], 
            dist[m[i, 1], 2], dist[m[i, 2], 2], h[i])
        k = (i - 1) * 4 + 1
        x[k:(k + 3)] = c$x
        y[k:(k + 3)] = c$y
    }
    x = pheatmap:::find_coordinates(n, gaps, x * n)$coord
    y = unit(y, "npc")
    if (!horizontal) {
        a = x
        x = unit(1, "npc") - y
        y = unit(1, "npc") - a
    }
    res = polylineGrob(x = x, y = y, id = id)
    return(res)
}
# Replace the non-exported function `draw_dendrogram` in `pheatmap`:
assignInNamespace(x="draw_dendrogram", value=draw_dendrogram, ns="pheatmap")

pheatmap(test)

结果是:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    相关资源
    最近更新 更多