ComplexHeatmap 注释似乎缺少数据
ComplexHeatmap annotation seems to be missing data
下面的玩具数据集似乎可以说明问题:
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(annodf$var1[column_order(ht)])
这给了我:
这看起来像 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)])
热图注释:, and the barplot:
这些匹配,因为第 2 和第 5 列的 var1=1。那么为什么注释和条形图不匹配更大的图?
x轴注释超过九行。只是在较小的 windows 中查看时您看不到它们,因为它们彼此太近了。如果将查看器 window 放大到足够远,您会看到它们就在那里。更好的是,将您的绘图输出为 PDF(这样它就不会丢失细节)并检查 pdf 版本。
pdf("heatmap.pdf")
draw(ht)
dev.off()
使用默认的高度和宽度,如果缩放到 150%,您将看到以下详细信息:
虽然您看到的与条形图不一样,但我无法验证您用于条形图的方法是否会给出与热图中相同的结果。注释上有 12 条不同的线,但无法看到热图上的 x 轴刻度,我无法冒险猜测条形图与热图不匹配的原因。
问题是注释不是绘制线本身而是填充的矩形,并且对于 1000 列,绘图例程无法一致地绘制填充的矩形(没有足够的分辨率来这样做)。从使用只有少量列的热图更新问题可以清楚地看出,绘制的 'lines' 是填充的矩形。
认为这是一个线条问题而不是填充矩形问题,我研究了 HeatmapAnnotation 函数中 gp(图形参数)参数的使用,看看我是否可以增加线条宽度,这样做就很清楚了它不是正在绘制的线条。例如,这里是使用 gpar 选项将线宽增加到一个大值的输出:
ha = HeatmapAnnotation(df=annodf, gp = gpar(col = annodf$var1[column_order(ht)],
lwd = unit(20, "native")))
带有圆形末端的黑线被绘制热图函数本身派生的填充覆盖。此外,在 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")))
因此,绘制的不是线条,而是填充的矩形,当数据集中的列太多时,会出现分辨率问题,导致某些带注释的填充不可见,具体取决于缩放比例正在查看注释。查看热图输出的 PDF 时也是如此。作为一种矢量格式,缩放级别会影响以较大比例绘制的内容,并显示在较低缩放级别下不显示的细节。所有 12 'lines'(实际上是填充的矩形)确实存在:
下面的玩具数据集似乎可以说明问题:
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):
我还可以将注释单独绘制为条形图,看看我认为它应该是什么样子
barplot(annodf$var1[column_order(ht)])
这给了我:
这看起来像 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)])
热图注释:
这些匹配,因为第 2 和第 5 列的 var1=1。那么为什么注释和条形图不匹配更大的图?
x轴注释超过九行。只是在较小的 windows 中查看时您看不到它们,因为它们彼此太近了。如果将查看器 window 放大到足够远,您会看到它们就在那里。更好的是,将您的绘图输出为 PDF(这样它就不会丢失细节)并检查 pdf 版本。
pdf("heatmap.pdf")
draw(ht)
dev.off()
使用默认的高度和宽度,如果缩放到 150%,您将看到以下详细信息:
虽然您看到的与条形图不一样,但我无法验证您用于条形图的方法是否会给出与热图中相同的结果。注释上有 12 条不同的线,但无法看到热图上的 x 轴刻度,我无法冒险猜测条形图与热图不匹配的原因。
问题是注释不是绘制线本身而是填充的矩形,并且对于 1000 列,绘图例程无法一致地绘制填充的矩形(没有足够的分辨率来这样做)。从使用只有少量列的热图更新问题可以清楚地看出,绘制的 'lines' 是填充的矩形。
认为这是一个线条问题而不是填充矩形问题,我研究了 HeatmapAnnotation 函数中 gp(图形参数)参数的使用,看看我是否可以增加线条宽度,这样做就很清楚了它不是正在绘制的线条。例如,这里是使用 gpar 选项将线宽增加到一个大值的输出:
ha = HeatmapAnnotation(df=annodf, gp = gpar(col = annodf$var1[column_order(ht)],
lwd = unit(20, "native")))
带有圆形末端的黑线被绘制热图函数本身派生的填充覆盖。此外,在 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")))
因此,绘制的不是线条,而是填充的矩形,当数据集中的列太多时,会出现分辨率问题,导致某些带注释的填充不可见,具体取决于缩放比例正在查看注释。查看热图输出的 PDF 时也是如此。作为一种矢量格式,缩放级别会影响以较大比例绘制的内容,并显示在较低缩放级别下不显示的细节。所有 12 'lines'(实际上是填充的矩形)确实存在: