3

从一个数据框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红色和bb1蓝色bb2)?

我已经检查了 R 包dendextend,但仍然无法找到直接/简单的方法来获得所需的结果。

<code>aa2</code> 和 <code>bb2</code> 的树状图聚类最紧密。 然后 <code>bb1</code> 是最接近的,其次是 <code>aa1</code>。 标签和分支根据标签着色。 那些以

4

3 回答 3

3

更改树状图的颜色比更改 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)

这将绘制

在此处输入图像描述

于 2015-05-06T17:24:05.460 回答
0

更新

我只留下我的答案,因为它有效的,并且有人可能会发现 OOMPA 很有用。但是,在看到MrFlick 建议的使用 dendrapply 的解决方案后,我推荐它。您可能会发现 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)

结果:

aa2 和 aa1 都为红色,而 bb1 和 bb2 为蓝色的聚类图

于 2015-05-06T16:40:59.900 回答
0

冰,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)

结果:

在此处输入图像描述

于 2015-07-11T15:41:29.817 回答