我正在尝试在
graphics::rect
函数调用的一行周围添加矩形框(即 heatmap
),如下所示:
stats::heatmap(matrix(data = rnorm(25),nrow = 5,ncol = 5),Colv = NA,scale = "none")
为了确定
rect
的参数,我需要能够自动检索绘制的热图的 xlim 和 ylim (不是侧面的树状图),但我不知道该怎么做..限制似乎不是 1:5(对于本例)。
知道在哪里放置
rect
角度的技巧是获取正确的用户坐标。不幸的是,par("usr")
(我最初的猜测)返回c(0, 1, 0, 1)
,没有帮助。然而,我通过阅读?heatmap
找到了一个关于为什么的线索,其中,在最后的“注释”中,它说
‘heatmap()’ uses layout and draws the image in the lower right
corner of a 2x2 layout. Consequentially, it can *not* be used in
a multi column/row layout, i.e., when ‘par(mfrow = *)’ or ‘(mfcol
= *)’ has been called.
这意味着在整个图完成后我们无法分解子图的用户坐标。然而......在同一个帮助页面中,我们看到
add.expr: expression that will be evaluated after the call to image.
Can be used to add components to the plot.
我相信“调用图像”意味着实际的矩阵颜色图。
所以我尝试了这个:
stats::heatmap(mtx, Colv = NA, scale = "none", add.expr = { browser(); 1; })
Browse[4]> par("usr")
[1] 0.5 5.5 0.5 5.5
好的,所以我们需要将您的
rect
添加到 add.expr
调用中,坐标很直观。
whichrow <- 3
xs <- c(0, ncol(mtx)) + 0.5
ys <- (whichrow - 1:0) + 0.5
stats::heatmap(
mtx, Colv = NA, scale = "none",
add.expr = {
rect(xs[1], ys[1], xs[2], ys[2], lwd = 3, xpd = NA)
}
)
备注:
0.5, 0.5
,所以我们需要相应地偏移xs
和ys
xpd=NA
是停止“剪辑”;如果没有它,左/右矩形边框的一部分会被剪掉,因此会更薄;不是必需的,但一致数据
set.seed(42)
mtx <- matrix(data = rnorm(25), nrow = 5, ncol = 5)