首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ComplexHeatmap注释似乎缺少数据。

ComplexHeatmap注释似乎缺少数据。
EN

Stack Overflow用户
提问于 2018-01-13 02:25:56
回答 2查看 868关注 0票数 1

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

代码语言:javascript
复制
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):

我可以在注释中识别出9行不同的行,尽管其中一行比较厚,并且可能由多行组成。

我还可以将注释单独绘制为一个barplot,以查看我认为它应该如何使用

代码语言:javascript
复制
barplot(annodf$var1[column_order(ht)])

这给了我:

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

代码语言:javascript
复制
> 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图:

代码语言:javascript
复制
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)])

heatmap注释:

,以及酒保:

这些匹配,因为第二列和第五列都有var1=1,那么为什么注释和标题栏不匹配更大的图呢?

交叉:https://github.com/jokergoo/ComplexHeatmap/issues/142

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-18 23:36:09

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

考虑到这是一个直线问题而不是填充矩形问题,我研究了在HeatmapAnnotation函数中使用gp (图形参数)参数来查看是否可以增加线宽,在这样做的过程中,很明显,绘制的不是直线。例如,下面是使用gpar选项将线宽提高到一个大值的输出:

代码语言:javascript
复制
ha = HeatmapAnnotation(df=annodf, gp = gpar(col = annodf$var1[column_order(ht)], 
                                            lwd = unit(20, "native")))

带有圆形末端的黑线由绘制热图函数本身导出的填充覆盖。此外,在HeatmapAnnotation中不允许使用gpar填充参数:

代码语言:javascript
复制
Error in SingleAnnotation(name = anno_name[i], value = df[, i], na_col = na_col,  : 
  You should not set `fill`. 

最后,您可能会看到,在研究这个问题时,我已经将gpar颜色参数设置为annodf$var1column_order(ht),它只在填充热图至少一次之后才能工作。当尝试使用gpar设置线宽时,注释的颜色将被覆盖,注释不超过一行,每列1行:

代码语言:javascript
复制
ha = HeatmapAnnotation(df=annodf, gp = gpar(lwd = unit(1, "native")))

因此,正在绘制的不是线条,而是填充的矩形,当数据集中有太多列时,就会出现一个分辨率问题,它会阻止某些带注释的填充依赖于正在查看注释的缩放而可见。在查看热图输出的PDF时也是如此。作为矢量格式,缩放级别会影响大比例尺绘制的内容,并显示在较低缩放级别上不显示的细节。所有12“行”(实际上是充满长方形的)都存在于此:

票数 1
EN

Stack Overflow用户

发布于 2018-01-13 08:43:03

X轴注释有超过9行。只是在较小的窗户里看不见它们,因为它们太近了。如果你缩放观众窗口足够远,你会看到他们在那里。更好的是,输出你的情节到PDF (这样它就不会失去细节),并检查pdf版本。

代码语言:javascript
复制
pdf("heatmap.pdf")
draw(ht)
dev.off()

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

虽然你看到的和你的标题图不一样,但我不能验证你所用的方法会给出和热图相同的结果。注释上有12条不同的行,但是没有能够在您的热图上看到x轴比例,我就无法猜测为什么barplot与热图不匹配。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48236408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档