【问题标题】:Formatting issues with Heatmap.2 function in gplots library - margins and axisgplots 库中 Heatmap.2 函数的格式问题 - 边距和轴
【发布时间】:2017-12-21 05:10:48
【问题描述】:

我使用 gplots 包中的 heatmap2 在 R 中创建了一个热图,我在尝试格式化图像以用于报告时遇到了极大的麻烦。

图像表示小波系数的小相关矩阵的特征值,我希望用红色等强烈的颜色表示最大的特征值,使用柔和的黄色或类似的颜色表示最小的特征值。调色板不是问题,而是颜色的表示。目前黄色代表最大的特征值,所以我希望尽可能颠倒顺序。

也可以旋转类似于下面第一张图片的图例,我已经检查了此类信息的帮助,但我能找到的只是行和列标签旋转?

由于我的数据代表一周每小时采集的数据,我如何更改 x 轴值以显示以下 12/24 小时向量:12,24,36,48,60,72,84,96,108,120,132,144,156,168。我尝试使用 cexCol 设置它,但我收到关于 cex.axis 长度错误的错误,我不认为这是 heatmap2 中的参数。

par(mfrow=c(1,1))
heatmap.2(eigenvalsCombined,
          trace = "none",
          dendrogram = "none",
          Rowv = NULL,
          Colv = NULL,
          density.info = "none",
          margin = c(5,7),
          main = expression(paste("Heatmap of Largest Eigenvalues ",
                                  lambda[1], 
                                  " Across 7 Wavelet Scales")),
          xlab = "Time Index (hours)",
          key = TRUE,
          lmat = rbind(c(2,3),c(4,1)),
          key.title = NA,
          key.xlab = "Eigenvalue Magnitude")

从我下面的图片中可以看出,主标题也被切掉了,我尝试过使用外边距和内边距,但这也没有任何影响。当我在绘图仪中使用缩放功能并放大显示文本的图像时,这是否意味着我的格式正确?

对于那些对数据感兴趣的人,我已将 dput(eigenvalsCombined) 的副本发布到 google drive 以供下载。

【问题讨论】:

    标签: r heatmap


    【解决方案1】:

    对于这样的任务,我喜欢调用image 或使用fields 包。对我来说,在这样的任务上使用 gplotsheatmap2 没有任何价值。

    library(fields)
    
    sq <- c("", seq(12,168, 12))
    
    par(mar=c(3.1,5.1,4.1,7.1), xpd=TRUE)
    image(t(eigenCombined), col = rev(heat.colors(100)), 
                xaxt="n", yaxt="n", bty="n", xlim=c(-0.15,1),
          main=expression(paste("Heatmap of Largest Eigenvalues ",
                                                        lambda[1], " Across 7 Wavelet Scales")))
    axis(4, at = seq(0,1, length.out = 7), 
         labels = rownames(eigenCombined), lty = 0, las=2)
    
    axis(1, at = seq(0,1, length.out = length(sq)), 
         labels = sq, lty = 0, las=2)
    
    image.plot(t(eigenCombined), legend.only = TRUE,
               col = rev(heat.colors(100)), 
               smallplot = c(0.05,0.1, 0.1,0.85))
    

    【讨论】:

      【解决方案2】:

      您可以在下面找到一些问题的解决方案。

      # (1) Define column names of data matrix following your 12/24hr vector
      clnames <- rep("",ncol(eigenvalsCombined))
      sq <- seq(12,168,12)
      clnames[sq] <- sq
      colnames(eigenvalsCombined) <- clnames
      
      # (2) Reverse your color map
      rev.heat.colors <- function(n) rev(heat.colors(n)) 
      
      library(gplots)
      #par(mfrow=c(1,1))
      
      heatmap.2(eigenvalsCombined,
                trace = "none",
                dendrogram = "none",
                Rowv = NULL,
                Colv = NULL,
                density.info = "none",
                margin = c(5,7),
                main = "",
                xlab = "Time Index (hours)",
                lmat = rbind(c(5,2,3),c(6,1,4)),
                lwid = c(0.2, 4, 1.1),
                lhei = c(0.5, 4),
                key = TRUE,
                key.xlab = "Eigenvalue Magnitude",
                col = "rev.heat.colors",
                cexCol=1.2)
      
      # Add title to the plot
      title(main=expression(paste("Heatmap of Largest Eigenvalues ",
                 lambda[1],  " Across 7 Wavelet Scales")))
      

      这是代码生成的图:

      编辑
      我修改了heatmap.2 函数,现在可以根据您的需要旋转颜色图。
      首先,从link 下载文件myheatmap2.r 并将其保存在您的工作目录中。
      然后,运行以下代码:

      clnames <- rep("",ncol(eigenvalsCombined))
      sq <- seq(12,168,12)
      clnames[sq] <- sq
      colnames(eigenvalsCombined) <- clnames   
      rev.heat.colors <- function(n) rev(heat.colors(n))
      
      library(gplots)
      source("myheatmap2.r")
      myheatmap.2(eigenvalsCombined,
                trace = "none",
                dendrogram = "none",
                Rowv = NULL,
                Colv = NULL,
                density.info = "none",
                margin = c(5,7),
                main = "",
                xlab = "Time Index (hours)",
                lmat = rbind(c(2,3,6),c(4,1,5)),
                lwid = c(0.8, 4, 0.5),
                lhei = c(0.5, 4),
                key = TRUE,
                key.title="",
                key.xlab = "Eigenvalue\n Magnitude",
                col = "rev.heat.colors",
                cexCol=1.2)
      
      title(main=expression(paste("Heatmap of Largest Eigenvalues ",
                 lambda[1],  " Across 7 Wavelet Scales")))
      

      这是最后的情节:

      【讨论】:

      • 非常感谢您的回答。我认为您的列名解决方案非常简单和出色,感谢您整理对齐方式,它让我疯狂地试图理解绘图窗口是如何排列为矩阵的。这是一个巨大的帮助,再次感谢您。我会接受这个传说,继续我的生活; )
      • 再次感谢您,您是一位绅士!我真的很感谢你花时间找到我的问题的解决方案。这对我帮助很大,再次感谢您。
      猜你喜欢
      • 1970-01-01
      • 2013-05-09
      • 1970-01-01
      • 2014-01-29
      • 1970-01-01
      • 1970-01-01
      • 2013-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多