移动 R heatmap.2 中的颜色键(gplots 包的函数)

33

我已经多次阅读了heatmap.2帮助手册,并在各种在线教程中阅读,但并没有找到将色彩键移动到不同位置的方法。

现在,我想知道是否有可能实现?

如果您使用gplots包中的heatmap.2函数,默认情况下,颜色键位于左上角。

2个回答

79

使用lmatlheilwid参数可以控制heatmap.2图中每个元素的位置。这些参数由heatmap.2传递给layout命令:

layout(mat = lmat, widths = lwid, heights = lhei)

lmat 是一个描述如何将屏幕分割的矩阵。默认情况下,heatmap.2 将屏幕分成一个四元格网格,因此lmat 是一个2x2的矩阵。矩阵中每个元素中的数字描述了下一个要绘制的四个图的顺序。Heatmap.2 按以下顺序绘制其元素:

  1. 热图,
  2. 行树状图,
  3. 列树状图,

因此默认的 lmat 是:

> rbind(4:3,2:1)
     [,1] [,2]
[1,]    4    3
[2,]    2    1
如果你想把钥匙放在热力图下面,你需要指定:
> lmat = rbind(c(0,3),c(2,1),c(0,4))
> lmat
     [,1] [,2]
[1,]    0    3
[2,]    2    1
[3,]    0    4

lwidlhei是指定每行和每列的高度和宽度的向量。默认值为c(1.5,4)。如果您更改了lmat,则可能需要相应地更改这些值。对于上面的示例,如果我们想要保持所有其他元素的大小不变,但想在底部添加一个细色键,则可以设置:

>lwid = c(1.5,4)
>lhei = c(1.5,4,1)
我们现在可以准备绘制热图:
>heatmap.2(x,...,lmat = lmat, lwid = lwid, lhei = lhei)

这将绘制一个热力图,其中列树形图位于热力图上方,行树形图位于左侧,并且键位于其下方。不幸的是,标题和键的标签是硬编码的。

更多有关 layout 如何工作的详细信息,请参见?layout


谢谢,这正是我在寻找的。非常详细的解释,我真的很感激。 - user2015601
1
哦,这比我想象的要容易得多。如果帮助页面也能这么清晰明了就好了。解释得很好。 - IRTFM
1
我想使用lmat = rbind(c(1,0),c(0,0))仅绘制热图,但系统告诉我不能这样做。这是否可能? - John

1

这段相当冗长的代码中,使用了par调用定义了特定区域,我还没有看到其原始作者或任何“修订者”在这些部分附近,尽管他们有时会在R-help上出现。主要绘图尺寸由2元素向量margins设置。以下是您可能需要进行更改的一些地方:

#1) 
if (!missing(RowSideColors)) {
    par(mar = c(margins[1], 0, 0, 0.5))
    image(rbind(1:nr), col = RowSideColors[rowInd], axes = FALSE)

#2)
if (!missing(ColSideColors)) {
    par(mar = c(0.5, 0, 0, margins[2]))
    image(cbind(1:nc), col = ColSideColors[colInd], axes = FALSE)

#3)
par(mar = c(margins[1], 0, 0, margins[2]))

#4)
par(mar = c(margins[1], 0, 0, 0))

#5)
par(mar = c(0, 0, if (!is.null(main)) 5 else 0, margins[2]))

#6
if (key) {
    par(mar = c(5, 4, 2, 1), cex = 0.75)

谢谢您的快速回复。然而,我仍然有一些困扰:我该如何使用您的代码?我收到了以下错误信息:“...找不到对象'margins'”。 - user2015601
我并没有给你代码。我只是指出了在“heatmap.2”的六页代码中需要更改的行,这可能会改变图形组件的布局。我认为这是一个相当大的工作,当问题不够明确时,我肯定不会尝试去做。 - IRTFM
抱歉我的无知。我想尝试的基本上是将键放在底部。我找到了另一个更简单的解决方案:使用lattice包中的levelplot()函数。感谢您的帮助。 - user2015601

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接