ComplexHeatmap注释似乎缺少数据

时间:2018-01-13 02:25:56

标签: r plot data-visualization heatmap

以下玩具数据集似乎证明了这个问题:

set.seed(0)
mm = matrix(data = rnorm(1000 * 8), nrow = 8)
rownames(mm) = letters[1:8]
annodf = data.frame(var1=rbinom(1000, 1, .01))

library(ComplexHeatmap)
ha = HeatmapAnnotation(df=annodf, col=list("var1"=c("0"="white","1"="red")))
ht = Heatmap(mm, show_column_dend = F, 
        show_column_names = F, bottom_annotation = ha)
draw(ht)

这是我在电脑上看到的图像(我正在使用Rstudio): enter image description here 我可以在注释中找出9条不同的线,但其中一条线较粗,可能由多条线组成。

我也可以将注释分别绘制成条形图,看看我认为它应该是什么样的

barplot(annodf$var1[column_order(ht)])

这给了我: enter image description here

这看起来像11行,其中一行可能由两行组成。我们可以查看数据:

> sum(annodf$var1)
[1] 12
> which(annodf$var1[column_order(ht)]==1)
 [1] 112 126 128 250 430 477 561 568 643 673 893 934

确认条形图是正确的。

为什么注释似乎缺少数据?

更新

我似乎没有在较小的数据集中看到这种差异。为了说明这一点,并确认编写注释的条形图的方法是正确的,我这样做是为了5x5图:

set.seed(0)
mm2 = matrix(data = rnorm(5 * 5), nrow = 5)
rownames(mm2) = letters[1:5]
colnames(mm2) = LETTERS[1:5]
annodf2 = data.frame(var1=rbinom(5, 1, .45))
ha2 = HeatmapAnnotation(df=annodf2, col=list("var1"=c("0"="white","1"="red")))
ht2 = Heatmap(mm2, show_column_dend = F, 
             show_column_names = F, bottom_annotation = ha2)
draw(ht2)
barplot(annodf2$var1[column_order(ht2)])

热图注释:enter image description here和条形图:enter image description here

这些匹配,因为第2列和第5列的var1 = 1。那么为什么注释和条形图不匹配更大的情节?

已转发:https://github.com/jokergoo/ComplexHeatmap/issues/142

2 个答案:

答案 0 :(得分:1)

x轴注释有九行以上。只是当您在较小的窗口中观看时,您无法看到它们,因为它们彼此距离太近。如果您将查看器窗口放大到足够远,您将看到它们在那里。更好的是,将您的绘图输出为PDF(这样不会丢失细节)并检查pdf版本。

pdf("heatmap.pdf")
draw(ht)
dev.off()

使用默认的高度和宽度,如果缩放到150%,您将看到以下细节:

enter image description here

虽然你看到的与你的条形图不同,但我无法验证你用于条形图的方法会得到与热图中相同的结果。注释上有十二条不同的线条,但是无法看到热图上x轴刻度的内容,我无法猜测为什么条形图与热图不匹配。

答案 1 :(得分:0)

问题在于注释不是这样绘制线条而是填充矩形,并且对于1000列,绘图例程无法一致地绘制填充的矩形(没有足够的分辨率来这样做)。从使用只有少量列的热图的问题更新中可以清楚地看到,'线'绘制的是填充矩形。

认为这是一个线问题而不是填充矩形问题,我调查了在HeatmapAnnotation函数中使用gp(图形参数)参数来查看是否可以增加线宽,并且这样做很明显它不是正在绘制的线条。例如,这里是使用gpar选项将线宽增加到一个大值的输出:

ha = HeatmapAnnotation(df=annodf, gp = gpar(col = annodf$var1[column_order(ht)], 
                                            lwd = unit(20, "native")))

enter image description here

具有圆形末端的黑色线条覆盖有绘制热图功能本身派生的填充。此外,在HeatmapAnnotation中不允许使用gpar fill 参数:

Error in SingleAnnotation(name = anno_name[i], value = df[, i], na_col = na_col,  : 
  You should not set `fill`. 

最后,您可能会看到,在调查此问题时,我已将gpar颜色参数设置为annodf $ var1 [column_order(ht)],该参数仅在热图至少填充一次后才有效。当尝试使用gpar设置线宽时,将覆盖注释的颜色,并且注释不会超过一定数量的线,每列为1:

ha = HeatmapAnnotation(df=annodf, gp = gpar(lwd = unit(1, "native")))

enter image description here

因此,它不是正在绘制的线条,而是填充的矩形,并且当数据集中的列太多时,存在分辨率问题,这会阻止某些带注释的填充可见,具体取决于注释的缩放比例正在观看。在查看热图输出的PDF时也是如此。作为矢量格式,缩放级别会影响在较大比例下绘制的内容,并显示在较低缩放级别下不显示的细节。所有12'线' (实际上是填充的矩形)确实存在:

enter image description here