web-dev-qa-db-fra.com

dendrogramme horizontal en R avec étiquettes

J'essaie de dessiner un dendrogramme à partir de la sortie de la fonction hclust. J'espère que le dendrogramme est disposé horizontalement au lieu de la valeur par défaut, qui peut être obtenu par (par exemple)

require(graphics)
hc <- hclust(dist(USArrests), "ave")
plot(hc)

J'ai essayé d'utiliser la fonction as.dendrogram() comme plot(as.dendrogram(hc.poi),horiz=TRUE) mais le résultat est sans étiquettes significatives:

enter image description here

Si j'utilise plot(hc.poi,labels=c(...)) qui est sans as.dendrogram(), je peux passer l'argument labels=, Mais maintenant le dendrogramme est vertical au lieu d'horizontal. Existe-t-il un moyen d'organiser simultanément le dendrogramme horizontalement et d'attribuer des étiquettes spécifiées par l'utilisateur? Merci!

pdate: comme exemple de l'ensemble de données USArrests, supposons que je veux utiliser les abréviations des deux premières lettres des noms d'état comme étiquettes, de sorte que je veux en quelque sorte passer labs dans le tracé fonction:

labs = substr(rownames(USArrests),1,2)

qui donne

 [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"
18
alittleboy

Pour afficher vos étiquettes définies dans un dendrogramme horizontal, une solution consiste à définir les noms de ligne du bloc de données sur de nouvelles étiquettes (toutes les étiquettes doivent être uniques).

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 utilisant 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

25
Didzis Elferts

En utilisant dendrapply, vous pouvez personnaliser votre dendro comme vous le souhaitez.

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)
25
agstudy