如何在R树形图中正确着色边缘或绘制rects?

时间:2009-04-04 20:21:37

标签: r edge-detection dendrogram hclust

我使用R的hclust()as.dendrogram()plot.dendrogram()函数生成this dendrogram

我使用了dendrapply()函数和一个局部函数来对叶子进行着色,这样可以正常工作。

我的统计测试结果表明是否有一组节点(例如右下角的“_+v\_stat5a\_01_”和“_+v\_stat5b\_01_”群集树的重要性或重要性。

我还有一个可以与dendrapply()一起使用的本地函数,它可以在我的树形图中找到包含重要叶子的确切节点。

我想(跟随例子):

  1. 为连接“_+v\_stat5a\_01_”和“_+v\_stat5b\_01_”的边缘着色;或者,
  2. 在“rect()”和“_+v\_stat5a\_01_”周围画一个_+v\_stat5b\_01_
  3. 我有以下本地函数(“nodes-in-leafList-match-nodes-in-clusterList”条件的详细信息并不重要,但它突出显示了重要节点):

    markSignificantClusters <<- function (n) {
      if (!is.leaf(n)) {
         a <- attributes(n)
         leafList <- unlist(dendrapply(n, listLabels))
         for (clusterIndex in 1:length(significantClustersList[[1]])) {
           clusterList <- unlist(significantClustersList[[1]][clusterIndex])
           if (nodes-in-leafList-match-nodes-in-clusterList) {
              # I now have a node "n" that contains significant leaves, and
              # I'd like to use a dendrapply() call to another local function
              # which colors the edges that run down to the leaves; or, draw
              # a rect() around the leaves
           }
         }
      }
    }
    

    if块中,我尝试调用dendrapply(n, markEdges),但这不起作用:

    markEdges <<- function (n) {
      a <- attributes(n)
      attr(n, "edgePar") <- c(a$edgePar, list(lty=3, col="red"))
    }
    

    在我的理想示例中,连接“_+v\_stat5a\_01_”和“_+v\_stat5b\_01_”的边将是虚线和红色。

    我也尝试在rect.hclust()块中使用if

    ma <- match(leafList, orderedLabels)  
    rect.hclust(scoreClusterObj, h = a$height, x = c(min(ma), max(ma)), border = 2)
    

    但结果不适用于水平树形图(带有水平标签的树状图)。 Here is an example(请注意右下角的红色条纹)。关于rect.hclust()生成的维度有什么不正确,我不知道它是如何工作的,能够编写我自己的版本。

    我感谢任何有关让edgeParrect.hclust()正常工作或能够编写我自己的rect.hclust()等效内容的建议。

    更新

    自从提出这个问题以来,我使用getAnywhere(rect.hclust())来获取计算参数的函数代码并绘制rect对象。我编写了这个函数的自定义版本来处理水平和垂直叶子,并用dendrapply()调用它。

    但是,某种裁剪效果会删除部分rect。对于水平叶子(在树的右侧绘制的叶子),rect的最右边消失或者比rect的其他三边的边界宽度更薄。对于垂直叶子(在树的底部绘制的叶子),rect的最下边缘会遇到相同的显示问题。

    我作为标记重要聚类的方法所做的是减少rect的宽度,使得我在聚类边缘的尖端和(水平)叶标签之间呈现垂直红色条纹。

    这消除了剪切问题,但引入了另一个问题,即簇边缘尖端和叶子标签之间的空间只有六个左右像素宽,我没有太多的控制权。这限制了垂直条纹的宽度。

    更糟糕的问题是x - 标记垂直条纹在两个元素之间可以适合的位置的坐标将根据较大树(par["usr"])的宽度而变化,而这又取决于关于树层次结构如何最终结构化。

    我写了一个“修正”,或者更好地称为修正水平树的x值和rect宽度的黑客。它并不总是一致地工作,但对于我正在制作的树木,它似乎不会太靠近(或重叠)边缘和标签。

    最终,更好的解决方法是找出如何绘制rect以便没有裁剪。或者一致的方法来计算树边缘和任何给定树的标签之间的特定x位置,以便正确地居中和调整条纹的大小。

    我也对使用颜色或线条样式注释边缘的方法非常感兴趣。

1 个答案:

答案 0 :(得分:2)

所以你实际上已经问了五个问题(5 +/- 3)。至于编写自己的rect.hclust函数,如果要查看它,源代码在library/stats/R/identify.hclust.R

我自己快速浏览了一下,并且不确定它是否按照我的想法完成了阅读你的描述 - 它似乎是在绘制多个矩形,而且{{1}选择器似乎是硬编码以水平分隔标签(这不是你想要的,也没有x)。

我会回来的,但与此同时你可能(除了查看来源)尝试使用不同的y颜色和不同的border=值进行多个rect.hclust,看看是否有失败模式出现。

<强>更新

我也没有太多运气。

剪裁的一个可能的方法是用尾随空格填充标签,然后稍微调整矩形的边缘(这个想法是只是将矩形放入剪切区域但覆盖结束时)标签)。

另一个想法是用半透明(低alpha)颜色填充矩形,形成阴影区域而不是边界框。