首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在R树状图中对边缘进行着色或正确地画直距?

如何在R树状图中对边缘进行着色或正确地画直距?
EN

Stack Overflow用户
提问于 2009-04-04 20:21:37
回答 1查看 2.8K关注 0票数 8

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

我使用了dendrapply()函数和一个局部函数来为叶子着色,这是很好的。

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

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

我想(以下例子)之一:

  1. 将连接"_+v\_stat5a\_01_“和”_+v\_stat5b\_01_“的边缘涂上颜色;或,
  2. 在"_+v\_stat5a\_01_“和"_+v\_stat5b\_01_”周围画一个_+v\_stat5b\_01_

我有以下本地函数( "nodes-in-leafList-match-nodes-in-clusterList“条件的细节并不重要,但它突出显示了重要节点):

代码语言:javascript
复制
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),但这没有起作用:

代码语言:javascript
复制
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

代码语言:javascript
复制
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的宽度,以便在集群边缘的尖端和(水平的)叶标签之间呈现一条垂直的红色条纹。

这消除了裁剪问题,但是引入了另一个问题,即集群边缘提示和叶标签之间的空间只有大约6个像素宽,我对此没有太多的控制。这限制了垂直条纹的宽度。

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

我写了一个“修正”,或者更准确地说,是一种调整水平树的x值和rect宽度的方法。它并不总是一致的工作,但对于我正在制作的树木,它似乎避免过于接近(或重叠)边缘和标签。

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-04-09 02:14:22

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

我自己看了一眼,不知道它是否能像我从你的描述中想象的那样--它似乎在绘制多个矩形,而且,x选择器似乎很难水平地分隔标签(这不是你想要的,也没有y)。

我会回来的,但在此期间,您可能(除了查看源代码)尝试使用不同的rect.hclust颜色和不同的h=值来查看是否出现了故障模式。

更新

我在这方面也没什么运气。

裁剪的一种可能的方法是用尾随空格填充标签,然后稍微将矩形的边缘带进(这个想法是,仅仅将矩形带进来就可以将其从裁剪区域中移出,但覆盖标签的末端)。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/717747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档