在gplots库中使用Heatmap.2函数格式化问题 - 边距和轴

时间:2017-07-16 16:52:45

标签: r heatmap

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

图像表示小波系数的小相关矩阵的特征值,并且我希望使用柔和的黄色或类似物来表示具有诸如红色和最小的强颜色的最大特征值。调色板不是问题,而是颜色的表现。目前黄色代表最大的特征值,所以我希望在可能的情况下颠倒顺序。

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

Ideal legend

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

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")

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

enter image description here

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

2 个答案:

答案 0 :(得分:4)

对于像这样的任务,我喜欢调用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))

enter image description here

答案 1 :(得分: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")))

这是代码生成的图:

enter image description here

修改
我修改了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")))

这是最终的情节:

enter image description here