Tree cut and Rectangles around clusters for a horizontal dendrogram in R

后端 未结 3 978
梦毁少年i
梦毁少年i 2020-12-29 14:25

I am trying to plot the results of a hierarchical clustering in R as a dendrogram, with rectangles identifying clusters.

The following code does the tr

3条回答
  •  南方客
    南方客 (楼主)
    2020-12-29 14:39

    To just get the job done (although in a quite ugly way) you could just manually swap the coordinates in the call to rect in rect.hclust:

    rhc <- function (tree, k = NULL, which = NULL, x = NULL, h = NULL, border = 2, 
        cluster = NULL) 
    {
        if (length(h) > 1L | length(k) > 1L) 
            stop("'k' and 'h' must be a scalar")
        if (!is.null(h)) {
            if (!is.null(k)) 
                stop("specify exactly one of 'k' and 'h'")
            k <- min(which(rev(tree$height) < h))
            k <- max(k, 2)
        }
        else if (is.null(k)) 
            stop("specify exactly one of 'k' and 'h'")
        if (k < 2 | k > length(tree$height)) 
            stop(gettextf("k must be between 2 and %d", length(tree$height)), 
                domain = NA)
        if (is.null(cluster)) 
            cluster <- cutree(tree, k = k)
        clustab <- table(cluster)[unique(cluster[tree$order])]
        m <- c(0, cumsum(clustab))
        if (!is.null(x)) {
            if (!is.null(which)) 
                stop("specify exactly one of 'which' and 'x'")
            which <- x
            for (n in seq_along(x)) which[n] <- max(which(m < x[n]))
        }
        else if (is.null(which)) 
            which <- 1L:k
        if (any(which > k)) 
            stop(gettextf("all elements of 'which' must be between 1 and %d", 
                k), domain = NA)
        border <- rep_len(border, length(which))
        retval <- list()
        for (n in seq_along(which)) {
            rect(
                 ybottom = m[which[n]] + 0.66,
                 xright = par("usr")[3L],
                 ytop = m[which[n] + 1] + 0.33,
                 xleft = mean(rev(tree$height)[(k - 1):k]),
                 border = border[n])
            retval[[n]] <- which(cluster == as.integer(names(clustab)[which[n]]))
        }
        invisible(retval)
    }
    

    and call rhc like you called rect.hclust:

    rhc(hca, k = 3, border = "red")
    

    enter image description here

提交回复
热议问题