我使用R的hclust()
,as.dendrogram()
和plot.dendrogram()
函数生成this 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)
但结果不适用于水平树形图(即带有水平标签的树状图)。 Here is an example(请注意右下角的红色条纹)。关于rect.hclust()
生成的维度有什么不正确,我不知道它是如何工作的,能够编写我自己的版本。
我感谢任何有关让edgePar
或rect.hclust()
正常工作或能够编写我自己的rect.hclust()
等效内容的建议。
更新
自从提出这个问题以来,我使用getAnywhere(rect.hclust())
来获取计算参数的函数代码并绘制rect
对象。我编写了这个函数的自定义版本来处理水平和垂直叶子,并用dendrapply()
调用它。
但是,某种裁剪效果会删除部分rect
。对于水平叶子(在树的右侧绘制的叶子),rect
的最右边消失或者比rect
的其他三边的边界宽度更薄。对于垂直叶子(在树的底部绘制的叶子),rect
的最下边缘会遇到相同的显示问题。
我作为标记重要聚类的方法所做的是减少rect
的宽度,使得我在聚类边缘的尖端和(水平)叶标签之间呈现垂直红色条纹。
这消除了剪切问题,但引入了另一个问题,即簇边缘尖端和叶子标签之间的空间只有六个左右像素宽,我没有太多的控制权。这限制了垂直条纹的宽度。
更糟糕的问题是x
- 标记垂直条纹在两个元素之间可以适合的位置的坐标将根据较大树(par["usr"]
)的宽度而变化,而这又取决于关于树层次结构如何最终结构化。
我写了一个“修正”,或者更好地称为修正水平树的x
值和rect
宽度的黑客。它并不总是一致地工作,但对于我正在制作的树木,它似乎不会太靠近(或重叠)边缘和标签。
最终,更好的解决方法是找出如何绘制rect
以便没有裁剪。或者一致的方法来计算树边缘和任何给定树的标签之间的特定x
位置,以便正确地居中和调整条纹的大小。
我也对使用颜色或线条样式注释边缘的方法非常感兴趣。
答案 0 :(得分:2)
所以你实际上已经问了五个问题(5 +/- 3)。至于编写自己的rect.hclust函数,如果要查看它,源代码在library/stats/R/identify.hclust.R
。
我自己快速浏览了一下,并且不确定它是否按照我的想法完成了阅读你的描述 - 它似乎是在绘制多个矩形,而且{{1}选择器似乎是硬编码以水平分隔标签(这不是你想要的,也没有x
)。
我会回来的,但与此同时你可能(除了查看来源)尝试使用不同的y
颜色和不同的border=
值进行多个rect.hclust,看看是否有失败模式出现。
<强>更新强>
我也没有太多运气。
剪裁的一个可能的方法是用尾随空格填充标签,然后稍微调整矩形的边缘(这个想法是只是将矩形放入剪切区域但覆盖结束时)标签)。
另一个想法是用半透明(低alpha)颜色填充矩形,形成阴影区域而不是边界框。