【问题标题】:Color branches of dendrogram using an existing column使用现有列的树状图的颜色分支
【发布时间】:2023-03-30 08:27:01
【问题描述】:

我有一个数据框,我正在尝试对其进行聚类。我现在正在使用hclust。在我的数据框中,有一个 FLAG 列,我想用它为树状图着色。通过生成的图片,我试图找出各种FLAG 类别之间的相似之处。我的数据框看起来像这样:

FLAG    ColA    ColB    ColC    ColD

我在 colAcolBcolCcolD 上进行聚类。我想根据FLAG 类别对它们进行聚类并着色。 Ex - 如果为 1,则为红色,如果为 0,则为蓝色(我只有两个类别)。现在我使用的是普通版的集群绘图。

hc<-hclust(dist(data[2:5]),method='complete')
plot(hc)

在这方面的任何帮助将不胜感激。

【问题讨论】:

    标签: r cluster-analysis hierarchical-clustering dendrogram dendextend


    【解决方案1】:

    如果您想根据某个变量为树状图的分​​支着色,那么以下代码(主要取自 dendrapply 函数的帮助)应该会给出所需的结果:

    x<-1:100
    dim(x)<-c(10,10)
    groups<-sample(c("red","blue"), 10, replace=TRUE)
    
    x.clust<-as.dendrogram(hclust(dist(x)))
    
    local({
      colLab <<- function(n) {
        if(is.leaf(n)) {
          a <- attributes(n)
          i <<- i+1
          attr(n, "edgePar") <-
            c(a$nodePar, list(col = mycols[i], lab.font= i%%3))
        }
        n
      }
      mycols <- groups
      i <- 0
    })
    
    x.clust.dend <- dendrapply(x.clust, colLab)
    plot(x.clust.dend)
    

    【讨论】:

    • 我不确定我是否在这里做错了,但这对我不起作用。我将groups 变量更改为我想要运行完全相同的代码的列,用我自己的数据框替换x。我得到了一个没有颜色的普通树状图。
    • 嗨 Pathebug,你能举一个你的数据框的小例子吗?请注意,在上面的示例中,我的 groups 变量是一个包含颜色“蓝色”和“红色”的字符向量。在您的情况下,您的标志向量因此也需要是颜色的字符向量。如果不是,假设您的变量包含两组,例如苹果和橙子,那么您将需要创建一个新向量,其中苹果和橙子引用您想要的颜色。Flag
    • 然后您将使用 Flag.colours 为您的分支着色。希望这会有所帮助。
    • 我也有类似的问题。但是,此代码仅在以下情况下才有效:1)先前从结果集群中提取提示的顺序,2)将提示分配给类别,3)为每个类别分配颜色。有没有办法根据包含提示 ID 名称及其类别或颜色的数据框自动将颜色分配给集群的提示?作为merge 函数。通过这种方式,我们不必从集群中提取提示。非常感谢您的这篇文章!
    【解决方案2】:

    我认为 Arhopala 的回答很好。我冒昧地更进一步,将函数assign_values_to_leaves_edgePar 添加到dendextend 包中(从版本0.17.2 开始,即now on github)。这个版本的函数比 Arhopala 的回答更加健壮和灵活,因为:

    1. 这是一个通用功能,可以在不同的问题/设置中工作
    2. 该函数可以处理其他edgePar参数(col、lwd、lty)
    3. 该功能提供部分向量的回收,并在需要时提供各种警告消息。

    要安装 dendextend 软件包,您可以使用install.packages('dendextend'),但对于最新版本,请使用以下代码:

    require2 <- function (package, ...) {
        if (!require(package)) install.packages(package); library(package)
    }
    
    ## require2('installr')
    ## install.Rtools() # run this if you are using Windows and don't have Rtools installed (you must have it for devtools)
    
    # Load devtools:
    require2("devtools")
    devtools::install_github('talgalili/dendextend')
    

    现在我们已经安装了dendextend,下面是对Arhopala 回答的第二个看法:

    x<-1:100
    dim(x)<-c(10,10)
    set.seed(1)
    groups<-sample(c("red","blue"), 10, replace=TRUE)
    x.clust<-as.dendrogram(hclust(dist(x)))
    
    x.clust.dend <- x.clust
    x.clust.dend <- assign_values_to_leaves_edgePar(x.clust.dend, value = groups, edgePar = "col") # add the colors.
    x.clust.dend <- assign_values_to_leaves_edgePar(x.clust.dend, value = 3, edgePar = "lwd") # make the lines thick
    plot(x.clust.dend)
    

    结果如下:

    p.s.:我个人更喜欢 using pipes 进行这种类型的编码(它会得到与上面相同的结果,但更容易阅读):

    x.clust <- x %>% dist  %>% hclust %>% as.dendrogram
    x.clust.dend <- x.clust %>% 
       assign_values_to_leaves_edgePar(value = groups, edgePar = "col") %>% # add the colors.
       assign_values_to_leaves_edgePar(value = 3, edgePar = "lwd") # make the lines thick
    plot(x.clust.dend)
    

    【讨论】:

      猜你喜欢
      • 2019-09-08
      • 2015-12-02
      • 2023-03-14
      • 1970-01-01
      • 2018-05-23
      • 1970-01-01
      • 1970-01-01
      • 2013-09-19
      • 2013-01-25
      相关资源
      最近更新 更多