【问题标题】:Coloring dendrogram’s end branches (or leaves) based on column number of data frame in R根据 R 中数据帧的列数为树状图的末端分支(或叶子)着色
【发布时间】:2015-07-15 17:32:42
【问题描述】:

从数据框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,但仍然无法找到直接/简单的方法来获得所需的结果。

【问题讨论】:

  • 请在示例输入数据中包含reproducible example,并描述您希望输出对于该特定数据的外观。这将使您更容易为您提供帮助。
  • 我已经编辑了这个问题,希望现在更清楚。
  • @MrFlick,很抱歉造成混淆。在之前的编辑中,虽然我提到“我希望与 aa1、aa2 对应的分支为红色,而 bb1 和 bb2 为蓝色”,但我没有提供正确的数字。

标签: r colors dataframe dendrogram dendextend


【解决方案1】:

更新

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


原答案

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

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

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

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)

结果:

【讨论】:

  • 感谢您的回复。但是,当我尝试安装 OOMPA 时,似乎没有什么问题。 1. 可能OOMPA 服务器已关闭。 install.packages 中的警告:无法打开:HTTP 状态为 '404 Not Found' install.packages 中的警告:无法访问存储库 rforge.net/bin/macosx/mavericks/contrib/3.1 包的索引 2. 'oompaBase' 不可用(对于R 版本 3.1.2)。此外,我的首要任务是获得彩色分支(不仅仅是标签)。这是因为我有大约 500 个标签会重叠,所以我想跳过标签而只选择分支。
  • 如果您对使用 OOMPA 感兴趣,您可能想稍后尝试。我也有 R 版本 3.1.2。看到你的问题后,我刚刚在 Linux (CentOS 6) 上安装了 OOMPA。
  • 好吧,我在 macOS 上使用 R。我又试了一次,但仍然有这些警告。 警告:无法访问存储库silicovore.com/OOMPA/bin/macosx/mavericks/contrib/3.1的索引 警告:无法访问存储库R-Forge.R-project.org/bin/macosx/mavericks/contrib/3.1的索引 警告:无法访问存储库rforge.net/bin/macosx/mavericks/contrib/3.1的索引 警告消息:包 'oompaBase'、'oompaData'、'PreProcess'、'ClassDiscovery'、'ClassComparison' 不可用(对于 R 版本 3.1.2) ps。我确信我的网速很棒!
  • 对于目前的问题,我建议按照 MrFlick 在他的回答中建议的那样做,并使用 dendrapply 函数(R 已经自带)。
  • 如果您真的想安装 OOMPA 并且无法安装,那么我建议将该问题作为单独的问题发布。
【解决方案2】:

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

哪个会画

【讨论】:

  • 可以用颜色代替标签吗? (根据已编辑问题的要求)
  • 是的,但现在我必须做一些额外的工作才能做到这一点。问题得到解答后最好不要更改。
  • @MrFlick 在我的机器上工作,它已经在 R 中可用(来自 stats 包)。非常好。
  • 请看下面的assign_values_to_leaves_edgePar函数。
【解决方案3】:

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)

结果:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-07
    • 2018-05-23
    • 2019-09-08
    • 2015-12-02
    • 2015-09-16
    • 2012-09-02
    • 2020-06-02
    • 1970-01-01
    相关资源
    最近更新 更多