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 (for example)
require(graphics) hc <- hclust(dist(USArrests), "ave") plot(hc)
I tried to use as.dendrogram()
function like plot(as.dendrogram(hc.poi),horiz=TRUE)
but the result is without meaningful labels:
If I use plot(hc.poi,labels=c(...))
which is without the as.dendrogram()
, I can pass the labels=
argument, but now the dendrogram is vertical instead of horizontal. Is there a way to simultaneously arrange the dendrogram horizontally and assign user-specified labels? Thanks!
Update: as an example from the USArrests dataset, suppose I wanna use the abbreviations of the first two letters of the state names as labels, so that I wanna somehow pass labs
into the plotting function:
labs = substr(rownames(USArrests),1,2)
which gives
[1] "Al" "Al" "Ar" "Ar" "Ca" "Co" "Co" "De" "Fl" "Ge" "Ha" [12] "Id" "Il" "In" "Io" "Ka" "Ke" "Lo" "Ma" "Ma" "Ma" "Mi" [23] "Mi" "Mi" "Mi" "Mo" "Ne" "Ne" "Ne" "Ne" "Ne" "Ne" "No" [34] "No" "Oh" "Ok" "Or" "Pe" "Rh" "So" "So" "Te" "Te" "Ut" [45] "Ve" "Vi" "Wa" "We" "Wi" "Wy"
As you already know, the standard R function plot. hclust() can be used to draw a dendrogram from the results of hierarchical clustering analyses (computed using hclust() function). A simplified format is: plot(x, labels = NULL, hang = 0.1, main = "Cluster dendrogram", sub = NULL, xlab = NULL, ylab = "Height", ...)
To visualize the dendrogram, we'll use the following R functions and packages: fviz_dend()[in factoextra R package] to create easily a ggplot2-based beautiful dendrogram. dendextend package to manipulate dendrograms.
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)
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())
Using dendrapply
you can customize your dendro as you like.
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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With