horizontal dendrogram in R with labels

后端 未结 2 2062
耶瑟儿~
耶瑟儿~ 2020-11-30 02:08

I am trying to draw a dendrogram from the hclust function output. I hope the dendrogram is horizontally arranged instead of the default, which can be obtain by

相关标签:
2条回答
  • 2020-11-30 02:45

    To show your defined labels in horizontal dendrogram, one solution is to set row names of data frame to new labels (all labels should be unique).

    require(graphics)
    labs = paste("sta_",1:50,sep="") #new labels
    USArrests2<-USArrests #new data frame (just to keep original unchanged)
    rownames(USArrests2)<-labs #set new row names
    hc <- hclust(dist(USArrests2), "ave")
    par(mar=c(3,1,1,5)) 
    plot(as.dendrogram(hc),horiz=T)
    

    enter image description here

    EDIT - solution using ggplot2

    labs = paste("sta_",1:50,sep="") #new labels
    rownames(USArrests)<-labs #set new row names
    hc <- hclust(dist(USArrests), "ave")
    
    library(ggplot2)
    library(ggdendro)
    
    #convert cluster object to use with ggplot
    dendr <- dendro_data(hc, type="rectangle") 
    
    #your own labels (now rownames) are supplied in geom_text() and label=label
    ggplot() + 
      geom_segment(data=segment(dendr), aes(x=x, y=y, xend=xend, yend=yend)) + 
      geom_text(data=label(dendr), aes(x=x, y=y, label=label, hjust=0), size=3) +
      coord_flip() + scale_y_reverse(expand=c(0.2, 0)) + 
      theme(axis.line.y=element_blank(),
            axis.ticks.y=element_blank(),
            axis.text.y=element_blank(),
            axis.title.y=element_blank(),
            panel.background=element_rect(fill="white"),
            panel.grid=element_blank())
    

    enter image description here

    0 讨论(0)
  • 2020-11-30 02:52

    Using dendrapply you can customize your dendro as you like.

    enter image description here

    colLab <- function(n) {
      if(is.leaf(n)) {
        a <- attributes(n)
        attr(n, "label") <- substr(a$label,1,2)             #  change the node label 
        attr(n, "nodePar") <- c(a$nodePar, lab.col = 'red') #   change the node color
      }
      n
    }
    
    require(graphics)
    hc <- hclust(dist(USArrests), "ave")
    clusDendro <- as.dendrogram(hc)
    clusDendro <- dendrapply(clusDendro, colLab)
    op <- par(mar = par("mar") + c(0,0,0,2))
    plot(clusDendro,horiz=T)
    
    0 讨论(0)
提交回复
热议问题