在 R 中的热图行上添加矩形

问题描述 投票:0回答:1

我正在尝试在

graphics::rect
函数调用的一行周围添加矩形框(即
heatmap
),如下所示:

stats::heatmap(matrix(data = rnorm(25),nrow = 5,ncol = 5),Colv = NA,scale = "none")

为了确定

rect
的参数,我需要能够自动检索绘制的热图的 xlim 和 ylim (不是侧面的树状图),但我不知道该怎么做..限制似乎不是 1:5(对于本例)。

r heatmap
1个回答
0
投票

知道在哪里放置

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)
© www.soinside.com 2019 - 2024. All rights reserved.