Vous pouvez essayer de réduire ylim
à la hauteur correspondante:
avec des données aléatoires:
set.seed(123)
testdata <- matrix(rnorm(300), ncol=3)
testcah <- hclust(dist(testdata))
La hauteur pour chaque étape du CAH sont dans testdata$heights
de la première à la dernière fusion. Si, par exemple, vous voulez 5 groupes, vous devez connaître le 4e avant la dernière hauteur:
floor_y <- rev(testcah$height)[5-1]
Ensuite, faire votre objet en tant que dendrogramme, vous pouvez tracer uniquement sur la partie dont vous avez besoin:
testdend <- as.dendrogram(testcah)
plot(testdend, ylim=c(floor_y, attributes(testdend)$height))
Si vous voulez étiqueter les branches avec les étiquettes de grappes, tels que définis par cutree
, vous devez obtenir les étiquettes (en réorganisant cutree
résultat) et trouver où les mettre le long de la x axis
. Cette information peut être obtenue en "décomposant" le dendrogramme pour obtenir le midpoints
nécessaire.
D'abord, obtenir les étiquettes de (tous) les feuilles:
testlab <- cutree(testcah, 5)[testcah$order]
Ensuite, nous utilisons une fonction récursive pour trouver les points médians des subdendrograms qui se trouve à la hauteur désirée:
find_x <- function(dendro, ordrecah, cutheight){
if(!is.null(attributes(dendro)$leaf)) { # if the dendrogram is a leaf, just get its position in the global dendrogram
return(which(ordrecah==attributes(dendro)$label))
} else {
if(attributes(dendro)$height<cutheight){ # if we're under the height threshold, get the midpoint
return(attributes(dendro)$midpoint)
} else { # if we're above the height threshold, pass the function on the 2 subparts of the dendrogram
return(c(find_x(dendro[[1]], ordrecah, cutheight), find_x(dendro[[2]], ordrecah, cutheight)))
}
}
}
Donc, nous pouvons obtenir les points milieu ou la position de la feuille avec:
test_x <- find_x(testdend, testcah$order, floor_y)
mais les points médians correspondent à la di position entre la feuille la plus à gauche et le noeud, donc, dans le cas d'un cluster avec plus d'un membre, nous devons ajouter la distance de 1 à la feuille la plus à gauche.
length_clus <- rle(testlab)$lengths # get the number of members by cluster
test_x[length_clus > 1] <- (test_x + head(c(1, cumsum(length_clus)+1), -1))[length_clus > 1]
Enfin, mettre les étiquettes sur le terrain:
mtext(side=1, at=test_x, line=0, text=unique(testlab))
Bienvenue sur Stack Overflow! S'il vous plaît lire les informations sur [comment poser une bonne question] (http://stackoverflow.com/help/how-to-ask) et comment donner un [exemple reproductible] (http://stackoverflow.com/questions/ 5963269). Cela rendra beaucoup plus facile pour les autres de vous aider. – zx8754