Search code examples
rfontscolorsdendrogramdendextend

R: Customized dendrogram - different leave node color and type by label


I have written the following MWE using dendextend (vignette):

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()

What I do here is just create a distance matrix with all the possible combinations of my labels in "d1" and some random values as distances.

I make a dendrogram out of the hclust results, and save it in the following TIFF file: test.tiff

As you see, I have been able to change the branches for "secondcelltype", but I need help to do the following, if it is even possible to do:

1 - Change "secondcelltype" leave node to a red square

2 - Change "secondcelltype" label to red (and maybe bold or italic)

3 - Change font everywhere to Arial

I would really appreciate some help here! If there is a better way to do this than with dendextend please let me know. Thanks!


Solution

  • Some responses:

    1) You don't need ggdendro here

    2) You need to use:

        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) I can't see an Ariel option, but you can use Standard values like "serif", "sans" and "mono" by using par(family = "sans")

    Here is a code that does what you asked for:

    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