Sie können versuchen, ylim
auf die entsprechende Höhe zu reduzieren:
mit Zufallsdaten: für jeden Schritt des CAH
set.seed(123)
testdata <- matrix(rnorm(300), ncol=3)
testcah <- hclust(dist(testdata))
Die Höhe sind in testdata$heights
von der ersten bis zur letzten Zusammenführung. Wenn Sie zum Beispiel 5 Gruppen wollen, müssen Sie die vierte vorletztes Höhe wissen:
floor_y <- rev(testcah$height)[5-1]
Dann Ihr Objekt als Dendrogramm zu machen, können Sie es zeichnen nur auf dem Teil, den Sie brauchen:
testdend <- as.dendrogram(testcah)
plot(testdend, ylim=c(floor_y, attributes(testdend)$height))
Wenn Sie die Zweige mit den Clustern Etiketten beschriften, wie cutree
definiert, müssen Sie die Etiketten bekommen (von cutree
Ergebnis Nachbestellung) und finden, wo sie entlang der x axis
zu setzen. Diese Information kann durch "Zerlegen" des Dendrogramms erhalten werden, um die benötigte midpoints
zu finieren.
Zunächst erhalten die Etiketten von (alle) die Blätter:
testlab <- cutree(testcah, 5)[testcah$order]
Dann benutzen wir eine rekursive Funktion die Mittelpunkte der subdendrograms zu finden, die in der gewünschten Höhe liegt:
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)))
}
}
}
So können wir die Mittelpunkte oder Blattposition mit erhalten:
test_x <- find_x(testdend, testcah$order, floor_y)
aber die Mittelpunkte entsprechen dem di Position zwischen dem linken Blatt und dem Knoten, so müssen wir im Falle eines Clusters mit mehr als einem Mitglied den Abstand von 1 zur linken Seite hinzufügen.
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]
Schließlich legte die Etiketten auf dem Grundstück:
mtext(side=1, at=test_x, line=0, text=unique(testlab))
Willkommen bei Stack-Überlauf! Bitte lesen Sie die Informationen über [wie man eine gute Frage stellt] (http://stackoverflow.com/help/how-to-ask) und wie man ein [reproduzierbares Beispiel gibt] (http://stackoverflow.com/questions/ 5963269). Dies wird es anderen sehr erleichtern, Ihnen zu helfen. – zx8754