根据 R 中数据框的列号为树状图的末端分支(或叶子)着色

Coloring dendrogram’s end branches (or leaves) based on column number of data frame in R

从数据帧 data.main,我能够生成一个 hclust 树状图,

aa1<- c(2,4,6,8)
bb1<- c(1,3,7,11)
aa2<-c(3,6,9,12)
bb2<-c(3,5,7,9)
data.main<- data.frame(aa1,bb1,aa2,bb2)
d1<-dist(t(data.main))
hcl1<- hclust(d1)
plot(hcl1)

此外,我知道有一些方法可以使用截断树来给树枝或树叶上色。但是,是否可以根据部分列名或列号为它们着色(例如,我希望对应于 aa1aa2 的分支为红色,而 bb1bb2 为红色蓝色)?

我已经检查了 R 包 dendextend 但我仍然无法找到 direct/easy 获得所需结果的方法。

更新

我之所以留下我的答案,是因为它有效的,而且有人可能会发现 OOMPA 有用。但是,在看到 之后,我推荐它。您可能会发现 OOMPA 包的其他功能很有用,但我不会仅仅为了核心 R 中已经存在的功能而安装它。


原答案

安装OOMPA(面向对象的微阵列和蛋白质组学分析包):

source("http://silicovore.com/OOMPA/oompaLite.R")
oompaLite()

然后使用库中的plotColoredClusters函数ClassDiscovery:

library(ClassDiscovery)
aa1<- c(2,4,6,8)
bb1<- c(1,3,7,11)
aa2<-c(3,6,9,12)
bb2<-c(3,5,7,9)
data.main<- data.frame(aa1,bb1,aa2,bb2)
d1<-dist(t(data.main))
hcl1<- hclust(d1)

#identify the labels
labels=hcl1[4]$labels

# Choose which ones are in the "aa" group
aa_present <- grepl("aa", labels)

colors <- ifelse(aa_present, "red", "blue")

plotColoredClusters(hcl1,labs=labels,cols=colors)

结果:

与 hclust 对象相比,更改树状图的颜色更容易,但转换起来非常简单。你可以做到

drg1 <- dendrapply(as.dendrogram(hcl1, hang=.1), function(n){
  if(is.leaf(n)){
    labelCol <- c(a="red", b="blue")[substr(attr(n,"label"),1,1)];
    attr(n, "nodePar") <- list(pch = NA, lab.col = labelCol);
    attr(n, "edgePar") <- list(col = labelCol); # to color branch as well
  }
  n;
});
plot(drg1)

哪个会画

ice,dendextend 包允许使用 assign_values_to_leaves_edgePar 函数来做到这一点。

使用方法如下:

aa1 <- c(2,4,6,8)
bb1 <- c(1,3,7,11)
aa2 <- c(3,6,9,12)
bb2 <- c(3,5,7,9)
data.main <- data.frame(aa1,bb1,aa2,bb2)
d1 <- dist(t(data.main))
hcl1 <- hclust(d1)
# plot(hcl1)

dend <- as.dendrogram(hcl1)
col_aa_red <- ifelse(grepl("aa", labels(dend)), "red", "blue")
dend2 <- assign_values_to_leaves_edgePar(dend=dend, value = col_aa_red, edgePar = "col")
plot(dend2)

结果: