8

我使用 R和函数生成了这个树状图。hclust()as.dendrogram()plot.dendrogram()

我使用这个dendrapply()函数和一个局部函数来给树叶上色,效果很好。

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

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

我想(按照示例):

  1. 为连接“ _+v\_stat5a\_01_”和“ _+v\_stat5b\_01_”的边缘着色;或者,
  2. 在“ ”和“ ”rect()周围画一个_+v\_stat5a\_01__+v\_stat5b\_01_

我有以下本地函数(“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)

但结果不适用于水平树状图(带有水平标签的树状图)。这是一个示例(请注意右下角的红色条纹)。生成的东西的尺寸不正确rect.hclust(),我不知道它是如何工作的,以便能够编写我自己的版本。

我很感激任何关于获得edgeParrect.hclust()正常工作的建议,或者能够编写我自己的rect.hclust()等价物。

更新

自从问了这个问题后,我getAnywhere(rect.hclust())就得到了计算参数和绘制rect对象的功能代码。我编写了这个函数的自定义版本来处理水平和垂直叶子,并用dendrapply().

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

作为标记重要簇的一种方法,我所做的是减小宽度,rect以便在簇边缘的尖端和(水平)叶子标签之间呈现垂直的红色条纹。

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

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

我写了一个“更正”,或者更确切地说,一个 hack 来调整这个x值和rect水平树的宽度。它并不总是始终如一地工作,但对于我正在制作的树木,它似乎不会太靠近(或重叠)边缘和标签。

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

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

4

1 回答 1

2

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

我自己快速浏览了一下,不确定它是否符合我阅读您的描述时的想法——它似乎正在绘制多个矩形,此外,x选择器似乎被硬编码以水平分隔标签(这是'不是你想要的,没有y)。

我会回来的,但与此同时,您可能(除了查看源代码之外)尝试使用不同border=颜色和不同h=值执行多个 rect.hclust 以查看是否出现故障模式。

更新

我在这方面也没有太多运气。

一种可能的剪辑方法是用尾随空格填充标签,然后稍微将矩形的边缘带入(想法是仅将矩形带入将使其脱离剪辑区域但覆盖标签的末端)。

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

于 2009-04-09T02:14:22.667 回答