2016-07-14 20 views
1

Ich habe folgende MWE mit dendextend (vignette) geschrieben:R: Customized dendrogram - verschiedene leave Knoten Farbe und Art von Etikett

library(cluster) 
library(ggdendro) 
library(dendextend) 
d1 <- c(paste(rep("firstcelltype",7),1:7,sep="_"), paste(rep("secondcelltype", 3),1:3,sep="_")) 
d1.df <- as.data.frame(t(combn(d1,2))) 
set.seed(1) 
d1.df$DIST <- sample(1:100, 45) 
dmat <- with(d1.df, structure(DIST, 
     Size = length(d1), 
     Labels = d1, 
     Diag = FALSE, 
     Upper = FALSE, 
     method = "user", 
     class = "dist")) 
c1 <- hclust(dmat, method="complete") 
dend <- as.dendrogram(c1) 
vals <- grep("second", d1, val=TRUE) 
dend <- dend %>% set("leaves_pch", 19) %>% 
     set("leaves_cex", 2) %>% 
     set("by_labels_branches_col", value = vals, TF_values = c(2,Inf)) %>% 
     set("by_labels_branches_lwd", value = vals, TF_values = c(4,2)) 
tiff("test.tiff") 
mar.default <- c(5,4,4,2) + 0.1 
par(mar = mar.default + c(0, 0, 0, 5)) 
plot(dend, main = "MY TITLE", xlab="my.X", horiz=TRUE) 
dev.off() 

Was mache ich hier nur eine Distanz Matrix mit allen möglichen Kombinationen erstellen meiner Etiketten in "d1" und einige zufällige Werte als Entfernungen.

Ich mache ein Dendrogramm aus den hclust Ergebnisse, und es in der folgenden TIFF-Datei speichern: test.tiff

Wie Sie sehen, ich in der Lage gewesen, die Zweige für „secondcelltype“ zu ändern, aber ich brauche Hilfe folgende zu tun, wenn es überhaupt möglich ist, zu tun:

1 - Change „secondcelltype“ leave Knoten auf ein rotes Quadrat

2 - Change „secondcelltype“ Label rot (und vielleicht fett oder kursiv)

3 - Schrift überall

auf Arial

ich wirklich etwas Hilfe hier schätzen würde! Wenn es einen besseren Weg gibt, dies zu tun als mit demendendend, lass es mich wissen. Vielen Dank!

Antwort

1

Einige Antworten:

1) Sie brauchen hier nicht ggdendro Sie

2) verwenden müssen:

set("labels_colors", ifelse(ss_change, 2, 1)) %>% 
    set("leaves_pch", ifelse(ss_change, 15, 19)) %>% 
    set("leaves_col", ifelse(ss_change, 2, 1)) 

3) Ich kann keine Ariel Option sehen, aber Sie können Standardwerte wie "serif", "sans" und "mono" verwenden, indem Sie par(family = "sans")

verwenden

Hier ist ein Code, der, was Sie wollten:

library(cluster) 
library(dendextend) 
d1 <- c(paste(rep("firstcelltype",7),1:7,sep="_"), paste(rep("secondcelltype", 3),1:3,sep="_")) 
d1.df <- as.data.frame(t(combn(d1,2))) 
set.seed(1) 
d1.df$DIST <- sample(1:100, 45) 
dmat <- with(d1.df, structure(DIST, 
     Size = length(d1), 
     Labels = d1, 
     Diag = FALSE, 
     Upper = FALSE, 
     method = "user", 
     class = "dist")) 
c1 <- hclust(dmat, method="complete") 
dend <- as.dendrogram(c1) 
vals <- grep("second", d1, val=TRUE) 

ss_change <- grepl("secondcelltype", labels(dend)) 

dend <- dend %>% 
     set("labels_colors", ifelse(ss_change, 2, 1)) %>% 
     set("leaves_pch", ifelse(ss_change, 15, 19)) %>% 
     set("leaves_col", ifelse(ss_change, 2, 1)) 
# str(unclass(dend)) 
# plot(dend) 

dend <- dend %>% 
     set("leaves_cex", 2) %>% 
     set("by_labels_branches_col", value = vals, TF_values = c(2,Inf)) %>% 
     set("by_labels_branches_lwd", value = vals, TF_values = c(4,2)) 


par(family = "sans") 
mar.default <- c(5,4,4,2) + 0.1 
par(mar = mar.default + c(0, 0, 0, 5)) 
plot(dend, main = "MY TITLE", xlab="my.X", horiz=TRUE) 

enter image description here

+0

Vielen Dank! Ich versuchte den Ansatz in http://stackoverflow.com/questions/14118033/horizontal-dendrogram-in-r-with-labels/14118735#14118735 aber aus irgendeinem Grund c (a $ nodePar, Liste (col = 'blau' , lab.col = 'blau', pch = 15)) ändert sich col und lab.col aber nicht pch ... – DaniCee

+0

Wenn Sie in der Lage sind, die Schriftart in Arial zu ändern, bitte updaten! Vielen Dank! – DaniCee

+0

@DaniCee Sie sind willkommen. Das manuelle Lösen dieser Probleme mit Dendrapply kann SEHR ermüdend sein (weil es etwas Verständnis benötigt, wie die Information gespeichert wird). Dies war Teil meiner Motivation, Dendextend zu schreiben. Was die Schriftarten anbetrifft, denke ich, dass es eine SO Frage selbst wert sein könnte (und schauen, ob andere Vorschläge haben). Prost, Tal –