I have tried to use rect.hclust() to draw a rectangle around a set of leaves, but am running into trouble.

The rect.hclust() is drawing two rects instead of one, and of the wrong size:

--------------------
scoreClusterObj <- hclust(scoreDistanceObj, method=clustMethod)
order <- scoreClusterObj$order
orderedLabels <- rep(0, length(order))
for (orderIndex in 1:length(order)) {
        # this puts a "name" to the permutation of leaves, done by hclust()
        orderedLabels[orderIndex] <- classes[order[orderIndex]]
}
scoreDendrogramObj <- as.dendrogram(scoreClusterObj)
coloredLeafScoreDendrogramObj <- dendrapply(scoreDendrogramObj, markColoredLeaves) scoreDendrogramPlot <- plot(coloredLeafScoreDendrogramObj, horiz=FALSE, axes=FALSE) significantClustersInScoreDendrogramObj <- dendrapply(coloredLeafScoreDendrogramObj, markSignificantClusters)
--------------------

I have the local functions markColoredLeaves() -- which changes the colors of certain leaves, and it works fine -- and another function called markSignificantClusters(), in which I try to draw a rect.hclust() if a condition is met (i.e. a cluster is statistically significant):

markSignificantClusters <<- function (n) {
        if (!is.leaf(n)) {
                a <- attributes(n)
                leafList <- unlist(dendrapply(n, listLabels))
                if (nodesContainCertainLeaves) {
                        ma <- match(leafList, orderedLabels)
                        print (paste ("min-ma", min(ma), "max-ma", max(ma), sep=" 
"))
r <- rect.hclust(scoreClusterObj, h = a$height, which = c(min(ma), max(ma)), border = 2)
                        print (r)
                        quit()
                }
        }
}

For testing, I have a call to quit() the script after the first qualifying node has a rect drawn around it.

So I run this script, and when I look at the runtime log output (from the print() statements), it finds the correct, qualifying node containing the following two items:

[1] "clusters"
[1] "+v_stat3_01" "+v_stat1_01"

These two leaves are located at positions 5 and 6 of the tree. This is correct output from the statistical test. So I should only get one rect drawn, of width 2, containing leaves 5 and 6.

Also, the "ma" variable is returning the correct leaf range (between 5 and 6, inclusively), so I know I'm passing the correct leaf range to the rect.hclust() function.

But in my graphical output, I get two rects at positions 6 and 7:

http://www.flickr.com/photos/alexreynolds/3409263765/sizes/o/

This doesn't seem to be an offset issue, for two reasons:

1. I am getting two rects, not one. Looking at the output from the print(r) statement, I see why two rects are drawn:

[[1]]
+v_stat1_01
        273

[[2]]
+v_e2f1_q6_01
          326

2. When I re-run the script, I can occasionally get different cluster results. In one case, where I should get one rect of size 3 (containing 3 leaves), instead I get two rects containing 2 and 4 leaves, resp. separated by several other clusters.

Worse, if I plot the dendrogram horizontally, the rects are drawn of completely wrong dimensions:

scoreDendrogramPlot <- plot(coloredLeafScoreDendrogramObj, horiz=TRUE, axes=FALSE)

yields:

http://www.flickr.com/photos/alexreynolds/3410126060/sizes/o/

Is there a way to use rect.hclust() that works reliably (in both orientations, or even in one orientation)?

Alternatively, is there a way to modify the thickness and color of the edges that draw down from a "significant" node?

I tried adding this to my markSignificantClusters() function, within the "if (nodesContainCertainLeaves)" block, to modify the edgePar settings of a qualifying node, to no effect:

n <- dendrapply(n, function(e) { attr(e, "edgePar") <- list(lty=3, col="red"); e })

If you got this far through this message, thanks. :) I would be grateful for any advice.

Thanks,
Alex

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to