R:自定义树状图 - 不同的叶子节点颜色和标签类型

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

我使用 dendextend (vignette) 编写了以下 MWE:

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

我在这里所做的只是创建一个距离矩阵,其中包含我在“d1”中的标签的所有可能组合以及一些随机值作为距离。

我根据 hclust 结果制作了树状图,并将其保存在以下 TIFF 文件中:

如您所见,我已经能够更改“secondcelltype”的分支,但我需要帮助才能完成以下操作,如果可能的话:

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

非常感谢您的帮助!如果有比使用 dendextend 更好的方法,请告诉我。谢谢!

部分回复:

1) 这里不需要 ggdendro

2) 您需要使用:

    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) 我看不到 Ariel 选项,但您可以使用 "serif"、"sans" 和 "mono" 等标准值,方法是使用 par(family = "sans")

这是一个可以满足您要求的代码:

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)