【问题标题】:Moving color key in R heatmap.2 (function of gplots package)在 R heatmap.2 中移动颜色键(gplots 包的功能)
【发布时间】:2013-02-27 09:30:40
【问题描述】:

我现在阅读了 heatmap.2 帮助手册几次,并且在各种在线教程中我也没有阅读到关于将颜色键移动到不同位置的方法。 现在,我想知道这是否可能?

如果你使用 gplots 包中的 heatmap.2 函数,颜色键默认在左上角。

【问题讨论】:

    标签: r heatmap color-key gplots


    【解决方案1】:

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

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

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

    1. 热图,
    2. 行树状图,
    3. 列树状图,
    4. 钥匙

    所以默认的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

    【讨论】:

    • 谢谢,这正是我要找的。非常详尽的解释,我真的很感激。
    • 天啊,这比我想象的要容易得多。如果只有帮助页面那么清晰。很好的解释。
    • 我只想使用 lmat = rbind(c(1,0),c(0,0)) 绘制热图,但系统告诉我不能。有可能吗?
    【解决方案2】:

    heatmap.2 的相当长的代码中,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)
    

    【讨论】:

    • 感谢您的快速回答。但是,我仍然有一些麻烦:我如何使用您的代码?我收到以下错误消息:...object 'margins' not found
    • 我没有给你代码。我指出在heatmap.2 的六页代码中要更改的行可能会改变图形组件的布局。我认为这是一项相当大的工作,当问题如此不精确时,我当然不会尝试。
    • 对不起我的无知。我基本上想尝试的是把钥匙放在底部。我找到了另一个更简单的解决方案:使用 lattice 包中的 levelplot()。感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 2014-01-29
    • 1970-01-01
    相关资源
    最近更新 更多