避免重新排序热图中的行和列 (r)

Avoid Re-Ordering of Rows and Columns in a Heatmap (r)

我正在使用 ComplexHeatmap 绘制数据,但是,每当我开始划分矩阵以便更容易阅读时,我的 rows/columns 的顺序似乎被打乱了。

我想知道我是否没有正确指定要使用的顺序,而不是与 ComplexHeatmap 用法直接相关的问题。比如下面是否有问题:

    Heatmap( as.matrix(MyData), name = "q", 
             column_names_rot = 0,
             col = my_palette,
             # ! ---> This should set the row order!!
             row_order = order(rownames(as.matrix(MyData))),
             # ! ---> This should set the column order!!
             column_order = order(colnames(as.matrix(MyData))),
             row_split = rep(c("A", "B","C", "D"), 6),
             column_split = rep(c("A", "B","C", "D"), 6),
             cluster_row_slices = FALSE,
             cluster_column_slices =FALSE,
             heatmap_legend_param = list(
               title = "Legend",
               col = my_palette,
               at = (c(0.05,0.03,0.01,0.000001)), 
               legend_height = unit(6, "cm")),
    )

以下论点是这个问题的关键:

                 # ! ---> This should set the row order!!
                 row_order = order(rownames(as.matrix(MyData))),
                 # ! ---> This should set the column order!!
                 column_order = order(colnames(as.matrix(MyData))),

当我创建这个热图时,行和列没有按顺序排列。例如

现在当我删除 row_splitcolumn_split 命令时,我不需要设置 row_ordercolumns_order 顺序,它看起来像这样:

我后来发现,当我使用 row_ordercolumn_order 而不拆分时,它实际上仍然会打乱我的顺序?

很明显,我什至无法在需要时按命令保留原始顺序。我想知道是否有人可以对此提供见解。

这是一个示例矩阵,可以根据他们的 supporting documents 制作(他们确实涵盖了 row_order 但我一定忽略了一些东西)。您可能想避免名称的改组,但考虑到我自己甚至不能使用这些命令,我​​对修改它感到紧张。

library(devtools)
install_github("jokergoo/ComplexHeatmap", force = TRUE)
library(ComplexHeatmap)

set.seed(123)
nr1 = 4; nr2 = 8; nr3 = 6; nr = nr1 + nr2 + nr3
nc1 = 6; nc2 = 8; nc3 = 10; nc = nc1 + nc2 + nc3
mat = cbind(rbind(matrix(rnorm(nr1*nc1, mean = 1,   sd = 0.5), nr = nr1),
          matrix(rnorm(nr2*nc1, mean = 0,   sd = 0.5), nr = nr2),
          matrix(rnorm(nr3*nc1, mean = 0,   sd = 0.5), nr = nr3)),
    rbind(matrix(rnorm(nr1*nc2, mean = 0,   sd = 0.5), nr = nr1),
          matrix(rnorm(nr2*nc2, mean = 1,   sd = 0.5), nr = nr2),
          matrix(rnorm(nr3*nc2, mean = 0,   sd = 0.5), nr = nr3)),
    rbind(matrix(rnorm(nr1*nc3, mean = 0.5, sd = 0.5), nr = nr1),
          matrix(rnorm(nr2*nc3, mean = 0.5, sd = 0.5), nr = nr2),
          matrix(rnorm(nr3*nc3, mean = 1,   sd = 0.5), nr = nr3))
   )
mat = mat[sample(nr, nr), sample(nc, nc)] # random shuffle rows and columns
rownames(mat) = paste0("row", seq_len(nr))
colnames(mat) = paste0("column", seq_len(nc))

Heatmap(mat)

以下是我一直在尝试的一些示例:

                 #row_order = sort(rownames(as.matrix(MyData))),
                 #row_order = rownames((MyData)),
                 #row_order = sort(rownames(MyData)),
                 #row_order = order((gsub("row", "", rownames(MyData)))),
                 #row_order = order(colnames(as.matrix(MyData))),
                 #column_order = order(rownames(as.matrix(MyData))),
                 #column_order = colnames(MyData),
                 #row_order = order(rownames(MyData)),
                 #column_order = order(as.matrix(MyData)),
                 #row_order = order(rownames(MyData)),
                 #column_order = order(colnames(MyData)),
                 #row_order = sort(c("C1", "C2", "C3", "C4", "C5", "C6", "C1", "C2", "C3", "C4", "C5", "C6", "C1", "C2", "C3", "C4", "C5", "C6", "C1", "C2", "C3", "C4", "C5", "C6")),
                 #olumn_order = sort(c("C1", "C2", "C3", "C4", "C5", "C6", "C1", "C2", "C3", "C4", "C5", "C6", "C1", "C2", "C3", "C4", "C5", "C6", "C1", "C2", "C3", "C4", "C5", "C6")),
                 #column_order = order(colnames(MyData)),
                 #column_order = sort(as.numeric(as.matrix(MyData))),
                 #column_order = order(colnames(MyData)),
                 #row_order = (MyData),
                 #column_order = sort(colnames(as.matrix(MyData))),
                 #row_order = rownames(MyData),
                 #row_order = sort(gsub("row", "", rownames(MyData))),
                 #row_order = order(colnames(as.matrix(MyData))),
                 #column_order = sort(colnames(as.matrix(MyData))),
                 #row_order = order(as.numeric(gsub("row", "", rownames(as.matrix(MyData))))), 
                 #column_order = order(as.numeric(gsub("column", "", colnames(as.matrix(MyData))))),
                 #row_order = order(rownames(as.matrix(MyData))), 
                 #column_order = order(colnames(as.matrix(MyData))),
                 #row_order = order(rownames(as.matrix(MyData))), 
                 #column_order = order(colnames(as.matrix(MyData))),

我认为问题在于如何正确设置拆分热图的变量。

Heatmap( (MyData), name = "namehere", 
             column_names_rot = 0,
             col = my_palette,
             cluster_rows = FALSE,
             cluster_columns = FALSE,
             row_split = rep(1:4, each = 6),
             column_split = rep(1:4, each = 6),
             heatmap_legend_param = list(
               title = "Legend",
               col = my_palette,
               at = (c(0.05,0.03,0.01,0.000001)), 
               legend_height = unit(6, "cm")),
            border = TRUE
    )

这里的游戏有点晚了,但我相信你在这里遇到的问题是由于因素的新生排序。具体来说,row_ 或 column_split 应该是一个因素,并且因素的水平应该对应于您希望在热图中的行或列的分区。级别的顺序决定了它们在热图中的表示方式,尽管在每个 level/split 中维护了表达式矩阵的顺序。因此,解决方案只是确保您的 row_ 或 column_split 是一个因素并适当地设置顺序。例如,如果您有一个看起来像 x<-c("C", "A", "B") 的 column_split 向量,并且您肯定希望遵守该顺序,那么 column_split = factor(x, levels=unique(x)) 应该起作用,因为 unique() 尊重输入向量的顺序(在本例中为 x)。