This is a test version of Biostars. For the public version, visit https://www.biostars.org.
Using block annotation with predefined dendrogram

Hi,

I am using ComplexHeatmaps to represent a heatmap data, but I want to cluster the columns by another value, so I am inputting a predefined dendrogram.

I would like to include a Block Annotation to be able to write inside each block.

I am giving a pre-clustered object to cluster_columns and when I try to do cluster_km I get the following message:

Error: You can not perform k-means clustering since you have already specified a clustering object.

I can split the columns using column_split, but then I cannot do block annotation, as my matrix ncols is the number of columns and not the number of clusters.

Error: number of observations in top annotation should be as same as ncol of the matrix.

Basically, I would like to find a way of writing inside each block of a predefined dendrogram.

Code for reference:

#Dimensions of my matrix, and the data I use to make the column dendrogram:
str(mat)
 num [1:26, 1:1195] 0 0 0 0 0 0 0 0 0 0 ...
 - attr(*, "dimnames")=List of 2
  ..$ : chr [1:26] "response to oxidative stress" "drug catabolic process" "aminoglycan catabolic process" "chitin metabolic process" ...
  ..$ : chr [1:1195] "AT1G21240" "AT1G09932" "AT2G18690" "AT4G36670" ...

str(MR_genes)
 num [1:1195, 1:1195] 0 2.23 2.15 3.54 1.22 ...
 - attr(*, "dimnames")=List of 2
  ..$ : Named chr [1:1195] "AT1G21240" "AT1G09932" "AT2G18690" "AT4G36670" ...
  .. ..- attr(*, "names")= chr [1:1195] "838719" "837526" "816384" "829820" ...
  ..$ : Named chr [1:1195] "AT1G21240" "AT1G09932" "AT2G18690" "AT4G36670" ...
  .. ..- attr(*, "names")= chr [1:1195] "838719" "837526" "816384" "829820" ...

#Clustering of the dendrogram:
clusters=5

dend = as.dendrogram(hclust(as.dist(MR_genes),method="ward.D2"),hang = -1)
cl_num = cutree(dend, k = clusters)

#Building top annotation:
ha_col = brewer.pal(clusters, "Set3")
names(ha_col) = unique(cl_num)
ha_col = list(cl_num=ha_col)

block_ha = HeatmapAnnotation(cl_num = anno_block(gp = gpar(fill = brewer.pal(clusters, "Set3"))),
                             labels = as.character(c(table(cl_num))))

#Plotting the heatmap with annotation:
mat_col = c("white","red")

Heatmap(mat, col = mat_col,
        show_heatmap_legend=F,
        cluster_columns = dend,
        column_split = clusters,
        column_title = top_title,
        show_column_names = F,
        top_annotation = block_ha,
        row_names_max_width = max_text_width(rownames(test)),
        clustering_method_rows = "ward.D2")

#Gives the following error:
Error: number of observations in top annotation should be as same as ncol of the matrix.

#If I do this, it works, but I cannot include labels in the blocks:
block_ha = HeatmapAnnotation(cl_num = anno_block(gp = gpar(fill = brewer.pal(clusters, "Set3")))

Here is how my heatmap looks like (without block annotation labels): image

r complexheatmap dendrogram clustering

0 answers

No answers yet.

Log in to answer this question.