在R

时间:2017-04-26 19:01:36

标签: r dendrogram

我正在使用hclust功能:

points <- data.frame(ID = c('A','B','C','D','E'), 
                 x = c(3,4,2.1,4,7), 
                 y = c(6.1,2,5,6,3))
d <- dist(as.matrix(points[, 2:3])) 
clusters <- hclust(d,method = "complete")
plot(clusters, labels=points$ID)

有没有办法显示连接点的值(或节点值(样本之间的相异性最小)?)

我希望我的情节看起来像照片上的情节。

注意:树形图上显示的值不正确。

Dendogram

2 个答案:

答案 0 :(得分:4)

以下是使用dendextend包的一种方法。

首先,转换为悬挂树状图

library(dendextend)
dend <- as.dendrogram(clusters) %>% hang.dendrogram()
dend <- dend %>% set_labels(points$ID[dend %>% labels()])

现在我们找到所有内部节点的x,y值

xy <- dend %>% get_nodes_xy()
is_internal_node <- is.na(dend %>% get_nodes_attr("leaf"))
is_internal_node[which.max(xy[,2])] <- FALSE
xy <- xy[is_internal_node,]

现在我们绘制树形图并以略微偏移绘制标签

plot(dend)
text(xy[,1]+.2, xy[,2]+.2, labels=format(xy[,2], digits=2), col="red")

这给出了以下情节

enter image description here

答案 1 :(得分:4)

我的R包TBEST有一个功能,可以为hclust对象添加两个颜色注释。为方便起见,我在下面粘贴代码,因此您可以独立于任何包使用它们。

hc2axes<-function (x) {
    A <- x$merge
    n <- nrow(A) + 1
    x.axis <- c()
    y.axis <- x$height
    x.tmp <- rep(0, 2)
    zz <- match(1:length(x$order), x$order)
    for (i in 1:(n - 1)) {
       ai <- A[i, 1]
       if (ai < 0) 
           x.tmp[1] <- zz[-ai]
       else x.tmp[1] <- x.axis[ai]
           ai <- A[i, 2]
       if (ai < 0) 
           x.tmp[2] <- zz[-ai]
       else x.tmp[2] <- x.axis[ai]
           x.axis[i] <- mean(x.tmp)
    }
    return(data.frame(x.axis = x.axis, y.axis = y.axis))
}



plot_height<-function (hc, height, col = c(2, 3), print.num = TRUE, float = 0.01, cex = NULL, font = NULL) 
{
    axes <- hc2axes(hc)
    usr <- par()$usr
    wid <- usr[4] - usr[3]
    bp <- as.character(round(height,2))
    rn <- as.character(1:length(height))
    bp[length(bp)] <- "height"
    rn[length(rn)] <- "edge #"
    a <- text(x = axes[, 1], y = axes[, 2] + float * wid, bp, 
        col = col[1], pos = 2, offset = 0.3, cex = cex, font = font)
    if (print.num) {
        a <- text(x = axes[, 1], y = axes[, 2], rn, col = col[2], 
            pos = 4, offset = 0.3, cex = cex, font = font)
    }
}

粘贴这两个函数后,添加一行来绘制树形图,     plot(clusters,labels=points$ID);
    cluster_height(clusters,height=clusters$height,print.num=F)

您还可以按setting print.num=T绘制分支编号 enter image description here