ComplexHeat:使用column_split时忽略column_order

问题描述 投票:0回答:1

我在ComplexHeatmap github中打开了这个问题,但到目前为止我没有得到任何回复,希望这里有人可以伸出援手......

我试图使最简单的热图成为可能,但行为不是我所期望的。我只想生成一个没有列聚类的热图,并且样本按特定的组顺序(非字母),组之间用间隙分隔。

问题是,当我想添加这样的间隙时,顺序会被忽略,并且默认为字母顺序。

使用

iris
数据检查以下 MWE。

1- 创建我的数据矩阵(仅用于

iris
setosa
物种的
virginica
的小子集),以及仅包含样本 ID 和物种(我的分组变量)的元信息数据框:

data(iris)
my_setosa=subset(iris, Species=="setosa")
my_virginica=subset(iris, Species=="virginica")
set.seed(123)
rows_used1 <- sort(sample(1:nrow(my_setosa), 5, replace = F))
rows_used2 <- sort(sample(1:nrow(my_virginica), 5, replace = F))
my_iris=rbind(my_setosa[rows_used1,], my_virginica[rows_used2,])
#
heat_mat=t(as.matrix(my_iris[,-ncol(my_iris)]))
meta_df=data.frame(ID=paste0("id",rownames(my_iris)), Species=my_iris[,ncol(my_iris)])
meta_df$Species=droplevels(meta_df$Species)
colnames(heat_mat)=meta_df$ID

这些看起来像这样:

> heat_mat
             id3 id14 id15 id31 id42 id114 id125 id137 id143 id150
Sepal.Length 4.7  4.3  5.8  4.8  4.5   5.7   6.7   6.3   5.8   5.9
Sepal.Width  3.2  3.0  4.0  3.1  2.3   2.5   3.3   3.4   2.7   3.0
Petal.Length 1.3  1.1  1.2  1.6  1.3   5.0   5.7   5.6   5.1   5.1
Petal.Width  0.2  0.1  0.2  0.2  0.3   2.0   2.1   2.4   1.9   1.8
> meta_df
      ID   Species
1    id3    setosa
2   id14    setosa
3   id15    setosa
4   id31    setosa
5   id42    setosa
6  id114 virginica
7  id125 virginica
8  id137 virginica
9  id143 virginica
10 id150 virginica

2- 定义热图和物种分组颜色、列注释(物种组)、列顺序和列分割(物种组之间的间隙):

palette=grDevices::colorRampPalette(c("green","black","red"))(11)
col_vec=c("red","blue")
col_vec=stats::setNames(col_vec, levels(meta_df$Species))
column_ha <- ComplexHeatmap::HeatmapAnnotation(
               Species = meta_df$Species,
               col = list(Species = col_vec),
               show_legend = TRUE)
column_order=meta_df[order(meta_df$Species, decreasing=T),]$ID
column_split <- meta_df$Species

请注意(这就是问题),我想要左侧的

virginica
组,右侧的
setosa
组,所以我的列顺序如下:

> column_order
 [1] "id114" "id125" "id137" "id143" "id150" "id3"   "id14"  "id15"  "id31"
[10] "id42"

3- 制作没有

column_split
的热图:

complex_heat <- ComplexHeatmap::Heatmap(heat_mat, cluster_rows = FALSE, cluster_columns = FALSE,
                                        row_dend_width = grid::unit(2, "inch"),
                                        rect_gp = grid::gpar(col = "white", lwd = 2),
                                        col = palette,
                                        top_annotation = column_ha,
                                        column_order = column_order,
                                        #column_split = column_split,
                                        column_gap = grid::unit(0.1, "inch"),
                                        border = TRUE)
grDevices::png(filename="heatmap.png", height=400, width=600)
ComplexHeatmap::draw(complex_heat)
grDevices::dev.off()

这一切都很好,下面生成的热图已正确排序了我的示例 ID,左侧为

virginica
(由
col_vector
指定为蓝色),右侧为
setosa
(由
col_vector
指定为红色) ):

4- 制作热图 with

column_split
;如果我只是取消注释指定按物种变量拆分列的
column_split
行,我会期望得到完全相同的热图,只是两个物种组之间有一个间隙。但是,
column_order
被忽略,并且
setosa
样本出现在左侧...

complex_heat <- ComplexHeatmap::Heatmap(heat_mat, cluster_rows = FALSE, cluster_columns = FALSE,
                                        row_dend_width = grid::unit(2, "inch"),
                                        rect_gp = grid::gpar(col = "white", lwd = 2),
                                        col = palette,
                                        top_annotation = column_ha,
                                        column_order = column_order,
                                        column_split = column_split,
                                        column_gap = grid::unit(0.1, "inch"),
                                        border = TRUE)

...你可能会说

column_split
需要是一个字符向量而不是一个因子,或者它需要与
column_order
中的样本具有相同的顺序(事实不应该是这样,它应该映射按
heat_mat
meta_df
顺序)。

显然,如果您只是执行

column_split=rev(column_split)
并尝试再次生成热图,样本分组就会变得混乱:

我不知所措......这应该非常容易完成,但我无法解决,而且在我的现实世界中,这不仅仅是一个装饰性的选择。

任何人都有线索,或者这只是包的一个错误而无法完成?谢谢!

r sorting heatmap complexheatmap
1个回答
0
投票

如果有人需要这个,

column_split
应该是一个因子,其顺序与
meta_df$Species
相同,但按照我们希望绘制的顺序指定级别...

column_split=rev(column_split))
levels(column_split)=rev(levels(column_split))
(我正在尝试的)不起作用,因为随着关于
meta_df$Species
的顺序发生变化,它们弄乱了样本组分配。

解决方案是像这样定义

column_split

column_split=factor(as.character(meta_df$Species), levels=c('virginica','setosa'))

...而不是

column_split <- meta_df$Species

© www.soinside.com 2019 - 2024. All rights reserved.