根据 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)
此外,我知道有一些方法可以使用截断树来给树枝或树叶上色。但是,是否可以根据部分列名或列号为它们着色(例如,我希望对应于 aa1
、aa2
的分支为红色,而 bb1
和 bb2
为红色蓝色)?
我已经检查了 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)
结果:
从数据帧 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)
此外,我知道有一些方法可以使用截断树来给树枝或树叶上色。但是,是否可以根据部分列名或列号为它们着色(例如,我希望对应于 aa1
、aa2
的分支为红色,而 bb1
和 bb2
为红色蓝色)?
我已经检查了 R 包 dendextend
但我仍然无法找到 direct/easy 获得所需结果的方法。
更新
我之所以留下我的答案,是因为它是有效的,而且有人可能会发现 OOMPA 有用。但是,在看到
原答案
安装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)
结果: