2014-12-15 7 views
7

? Ich habe ein Dendrogramm erstellt, nachdem ich eine hierarchische Clusteranalyse in R unter Verwendung des folgenden Codes durchgeführt habe. Ich versuche nun, die Etiketten nach einer anderen Faktorvariablen zu färben, die als Vektor gespeichert wird. Am nächsten komme ich dazu, die Zweige unter Verwendung der ColourDendrogram-Funktion in dem sparcl-Paket farblich zu codieren. Wenn möglich, würde ich es vorziehen, die Etiketten farbig zu codieren. Ich habe Antworten auf ähnliche Fragen bei den folgenden Links Color branches of dendrogram using an existing column & Colouring branches in a dendrogram in R gefunden, aber ich konnte nicht herausfinden, wie Sie den Beispielcode für meinen Zweck konvertieren. Im Folgenden finden Sie einige Beispieldaten und -code.Wie beschriftet man die Bezeichnungen eines Dendrogramms mit einer zusätzlichen Faktorvariablen in R

> dput(df) 
structure(list(labs = c("a1", "a2", "a3", "a4", "a5", "a6", "a7", 
"a8", "b1", "b2", "b3", "b4", "b5", "b6", "b7"), var = c(1L, 
1L, 2L, 1L, 2L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 2L, 2L), td = c(13.1, 
14.5, 16.7, 12.9, 14.9, 15.6, 13.4, 15.3, 12.8, 14.5, 14.7, 13.1, 
14.9, 15.6, 14.6), fd = c(2L, 3L, 3L, 1L, 2L, 3L, 2L, 3L, 2L, 
4L, 2L, 1L, 4L, 3L, 3L)), .Names = c("labs", "var", "td", "fd" 
), class = "data.frame", row.names = c(NA, -15L)) 

df.nw = df[,3:4] 
labs = df$labs 

d = dist(as.matrix(df.nw))       # find distance matrix 
hc = hclust(d, method="complete")     # apply hierarchical clustering 
plot(hc, hang=-0.01, cex=0.6, labels=labs, xlab="") # plot the dendrogram 

hcd = as.dendrogram(hc)        # convert hclust to dendrogram 
plot(hcd, cex=0.6)         # plot using dendrogram object 

Var = df$var          # factor variable for colours 
varCol = gsub("1","red",Var)      # convert numbers to colours 
varCol = gsub("2","blue",varCol) 

# colour-code dendrogram branches by a factor 
library(sparcl) 
ColorDendrogram(hc, y=varCol, branchlength=0.9, labels=labs, 
       xlab="", ylab="", sub="") 

Jede Beratung, wie dies zu tun wäre, würde sehr geschätzt werden.

Antwort

3

Versuchen

# ... your code 
colLab <- function(n) { 
    if(is.leaf(n)) { 
    a <- attributes(n) 
    attr(n, "label") <- labs[a$label] 
    attr(n, "nodePar") <- c(a$nodePar, lab.col = varCol[a$label]) 
    } 
    n 
} 
plot(dendrapply(hcd, colLab)) 

(via)

+0

@ luke: danke für deine antwort. Dies ergibt die richtigen Farben, erlaubt aber keine benutzerspezifischen Beschriftungen (die oben mit "Labs" angegeben wurden). Nach dem Code gefunden http://stackoverflow.com/questions/14118033/horizontal-dendrogram-in-r-with-labels/14118735#14118735 Ich habe versucht, Folgendes zur Funktion hinzufügen 'attr (n," Label ") < "Labs", aber dann endete mit einem Dendrogramm mit unleserlichen Etiketten (es sah so aus, als ob R eine Reihe verschiedener Etiketten übereinander überschrieben hätte). – jjulip

+0

Ich habe auch versucht, die df Zeilennamen vor dem Ausführen von hclust zu ändern und das hat nicht funktioniert. Irgendwelche Ideen, wie ich farbige benutzerspezifische Etiketten bekommen kann? danke für Ihre Hilfe. – jjulip

+0

@jjulip Probieren Sie 'attr (n," label ") <- labs [a $ label]' anstelle von 'attr (n," label ") <- labs'. – lukeA

2

Für Ihre Etiketten Färbung, wäre es am einfachsten zu verwenden, um die labels_colors Funktion aus dem dendextend Paket sein. Zum Beispiel:

# install.packages("dendextend") 
library(dendextend) 

small_iris <- iris[c(1, 51, 101, 2, 52, 102), ] 
dend <- as.dendrogram(hclust(dist(small_iris[,-5]))) 
# Like: 
# dend <- small_iris[,-5] %>% dist %>% hclust %>% as.dendrogram 

# By default, the dend has no colors to the labels 
labels_colors(dend) 
par(mfrow = c(1,2)) 
plot(dend, main = "Original dend") 

# let's add some color: 
colors_to_use <- as.numeric(small_iris[,5]) 
colors_to_use 
# But sort them based on their order in dend: 
colors_to_use <- colors_to_use[order.dendrogram(dend)] 
colors_to_use 
# Now we can use them 
labels_colors(dend) <- colors_to_use 
# Now each state has a color 
labels_colors(dend) 
plot(dend, main = "A color for every Species") 

Für weitere Informationen über das Paket, können Sie einen Blick at its vignette haben.

enter image description here

+0

@ Tal: Habe das gerade gesehen. Danke für die Antwort! Wirklich hilfreich. – jjulip

+0

Danke @jjulip. Prost, T –

+0

Hallo @jjulip - Ich habe eine detailliertere Antwort hinzugefügt. Ich hoffe, Sie könnten es als eine Lösung markieren. Vielen Dank. –

Verwandte Themen