Ändern Dendrogram Blätter
-
12-10-2019 - |
Frage
Ich mag die Eigenschaften der Blätter in einem Dendrogramm von Plot eines hclust Objekt erzeugt ändern. Minimal, möchte ich die Farben ändern, aber jede Hilfe Sie sei darauf hingewiesen, zur Verfügung stellen kann.
Ich habe versucht, die Antwort auf Google, aber aber jede Lösung, die ich sehe schien viel härter als das, was ich geahnt hätte.
Lösung
Vor einiger Zeit Joris Meys freundlich mir mit diesem Code-Snippet zur Verfügung gestellt, die die Farbe der Blätter ändern. Ändern sie Ihre Attribute widerzuspiegeln.
clusDendro <- as.dendrogram(Clustering)
labelColors <- c("red", "blue", "darkgreen", "darkgrey", "purple")
## function to get colorlabels
colLab <- function(n) {
if(is.leaf(n)) {
a <- attributes(n)
# clusMember - a vector designating leaf grouping
# labelColors - a vector of colors for the above grouping
labCol <- labelColors[clusMember[which(names(clusMember) == a$label)]]
attr(n, "nodePar") <- c(a$nodePar, lab.col = labCol)
}
n
}
## Graph
clusDendro <- dendrapply(clusDendro, colLab)
op <- par(mar = par("mar") + c(0,0,0,2))
plot(clusDendro,
main = "Major title",
horiz = T, type = "triangle", center = T)
par(op)
Andere Tipps
Hier ist eine Lösung für diese Frage ein neues Paket mit dem Namen „ dendextend “, gebaut genau für diese Art der Sache.
Sie können viele Beispiele in den Vorträgen und Vignetten des Pakets, in der "Nutzung" in der folgenden URL finden Sie unter:
Es ist nicht klar, was Sie dafür verwenden wollen, aber ich brauche oft eine Niederlassung in einem Dendrogramm zu identifizieren. Ich habe die rect.hclust Methode gehackt eine Dichte und Label-Eingabe hinzuzufügen.
Sie würde es so nennen:
k <- 3 # number of branches to identify
labels.to.identify <- c('1','2','3')
required.density <- 10 # the density of shading lines, in lines per inch
rect.hclust.nice(tree, k, labels=labels.to.identify, density=density.required)
Hier ist die Funktion
rect.hclust.nice = function (tree, k = NULL, which = NULL, x = NULL, h = NULL, border = 2,
cluster = NULL, density = NULL,labels = NULL, ...)
{
if (length(h) > 1 | length(k) > 1)
stop("'k' and 'h' must be a scalar")
if (!is.null(h)) {
if (!is.null(k))
stop("specify exactly one of 'k' and 'h'")
k <- min(which(rev(tree$height) < h))
k <- max(k, 2)
}
else if (is.null(k))
stop("specify exactly one of 'k' and 'h'")
if (k < 2 | k > length(tree$height))
stop(gettextf("k must be between 2 and %d", length(tree$height)),
domain = NA)
if (is.null(cluster))
cluster <- cutree(tree, k = k)
clustab <- table(cluster)[unique(cluster[tree$order])]
m <- c(0, cumsum(clustab))
if (!is.null(x)) {
if (!is.null(which))
stop("specify exactly one of 'which' and 'x'")
which <- x
for (n in 1L:length(x)) which[n] <- max(which(m < x[n]))
}
else if (is.null(which))
which <- 1L:k
if (any(which > k))
stop(gettextf("all elements of 'which' must be between 1 and %d",
k), domain = NA)
border <- rep(border, length.out = length(which))
labels <- rep(labels, length.out = length(which))
retval <- list()
for (n in 1L:length(which)) {
rect(m[which[n]] + 0.66, par("usr")[3L], m[which[n] +
1] + 0.33, mean(rev(tree$height)[(k - 1):k]), border = border[n], col = border[n], density = density, ...)
text((m[which[n]] + m[which[n] + 1]+1)/2, grconvertY(grconvertY(par("usr")[3L],"user","ndc")+0.02,"ndc","user"),labels[n])
retval[[n]] <- which(cluster == as.integer(names(clustab)[which[n]]))
}
invisible(retval)
}