我产生这种树状图,使用R的hclust()
,as.dendrogram()
和plot.dendrogram()
功能.
我使用dendrapply()
函数和局部函数来为叶子着色,这很好.
我有统计测试的结果,表明一组节点(例如树的右下角的" _+v\_stat5a\_01_
"和" _+v\_stat5b\_01_
" 的簇)是重要的还是重要的.
我还有一个可以使用的本地函数,dendrapply()
它在我的树形图中找到包含重要叶子的确切节点.
我想(根据例子):
为连接" _+v\_stat5a\_01_
"和" _+v\_stat5b\_01_
" 的边缘着色; 要么,
画一个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()
生成的维度的某些方面是不正确的,我不知道它是如何工作的,能够编写我自己的版本.
我很欣赏任何关于获得edgePar
或rect.hclust()
正常工作的建议,或者能够写出我自己的rect.hclust()
等价物.
UPDATE
自从提出这个问题以来,我曾经getAnywhere(rect.hclust())
得到了计算参数和绘制rect
对象的功能代码.我写了一个这个函数的自定义版本来处理水平和垂直叶子,并调用它dendrapply()
.
但是,有一种削减效果可以消除部分内容rect
.对于水平叶子(在树的右侧绘制的叶子),它们的最右边rect
消失或者比其他三边的边缘宽度更薄rect
.对于垂直叶子(在树的底部绘制的叶子),最底部的边缘rect
会遇到相同的显示问题.
我作为标记重要簇的方法所做的是减小这样的宽度,rect
使得在簇边缘的尖端和(水平)叶片标签之间呈现垂直红色条纹.
这消除了剪切问题,但引入了另一个问题,因为簇边缘尖端和叶子标签之间的空间只有六个左右像素宽,我没有太多的控制权.这限制了垂直条纹的宽度.
更糟糕的问题是,x
标记垂直条纹在两个元素之间可以适合的位置的坐标将根据较大树(par["usr"]
)的宽度而改变,而树的宽度又取决于树层次结构的结构.
我写了一个"修正",或者更好地称为修正这个x
值和rect
水平树木宽度的黑客.它并不总是一致地工作,但对于我正在制作的树木,它似乎不会太靠近(或重叠)边缘和标签.
最终,一个更好的解决方法是找出如何绘制,rect
以便没有裁剪.或者一致的方法来计算x
树边缘和任何给定树的标签之间的特定位置,以便正确地居中和调整条纹的大小.
我也对使用颜色或线条样式注释边缘的方法非常感兴趣.