Question: Complex Heatmap: Changing order of clusters
gravatar for yomogy
15 months ago by
yomogy90 wrote:

I have a question about how to change order of clusters on heatmap. I tried to make heatmap using Complex Heatmap package and I made K-mean clusters. my code is below:

 HM <- Heatmap(matrix2, km = 4, show_row_names = FALSE, show_column_names = F, top_annotation = ha_column, cluster_columns = FALSE, show_heatmap_legend = T)
draw(HM, heatmap_legend_side = "right", show_annotation_legend = F)

I got this heatmap as below.

Heat map

In this example, I want to move cluster 2 to top, cluster 1 in 2nd top, cluster 3 on 3rd and cluster 4 on the bottom. How can I re-order the position of clusters ?

heatmap R • 3.6k views
ADD COMMENTlink modified 15 months ago by Kevin Blighe45k • written 15 months ago by yomogy90

For future reference: On site scroll down and look for a tab that says Embed codes. Click on Embed codes. Copy the code in HTML full image box. Post that line into your post here to parse the image in automatically (like above).

ADD REPLYlink modified 15 months ago • written 15 months ago by genomax69k
gravatar for Kevin Blighe
15 months ago by
Kevin Blighe45k
Kevin Blighe45k wrote:

I'm a big fan of ComplexHeatmap and again kudos to the developer for making it such a flexible package. However, I'm not immediately aware of a function that does (directly) what you want.

I would prefer to perform the k-means outside of the ComplexHeatmap package by just using kmeans(), and then manipulating the gene-to-cluster assignment vector in order to dictate the order of the clusters.

Create some random data (20 genes x 20 samples):

test <- matrix(rexp(400, rate=.3), ncol=20)
rownames(test) <- paste(rep("Gene", nrow(test)), 1:nrow(test), sep="")
colnames(test) <- paste(rep("Sample", ncol(test)), 1:ncol(test), sep="")

We then perform k-means with 4 centers and take a look at the gene-to-cluster assignment:

kclus <- kmeans(test, 4)
 Gene1  Gene2  Gene3  Gene4  Gene5  Gene6  Gene7  Gene8  Gene9 Gene10 Gene11 
     3      3      2      1      2      1      3      1      2      1      4 
Gene12 Gene13 Gene14 Gene15 Gene16 Gene17 Gene18 Gene19 Gene20 
     4      4      1      2      4      2      2      4      2

We then use the split parameter of Heatmap() in order to split the heatmap based on the k-means result:

split <- paste0("Cluster\n", kclus$cluster)
default.hmap <- Heatmap(test, split=split)

As we want to fix the order of the clusters, we have to re-order the gene-to-cluster assignment as a factor:

split <- factor(paste0("Cluster\n", kclus$cluster), levels=c("Cluster\n2","Cluster\n1","Cluster\n3","Cluster\n4"))
reorder.hmap <- Heatmap(test, split=split)

Then draw both the default-ordered and then re-ordered:

pushViewport(viewport(layout=grid.layout(nr=1, nc=2)))

  pushViewport(viewport(layout.pos.row=1, layout.pos.col=1))
    draw(default.hmap, newpage=FALSE)

  pushViewport(viewport(layout.pos.row=1, layout.pos.col=2))
    draw(reorder.hmap, newpage=FALSE)



ADD COMMENTlink modified 3 months ago • written 15 months ago by Kevin Blighe45k

Thanks Kevin, it works perfecctly!!

ADD REPLYlink written 15 months ago by yomogy90

And thank you for the question - I will re-use this code myself some time!

ADD REPLYlink written 15 months ago by Kevin Blighe45k

Thanks Kevin, this is very useful code.

ADD REPLYlink written 15 months ago by Mike1.3k
Please log in to add an answer.


Use of this site constitutes acceptance of our User Agreement and Privacy Policy.
Powered by Biostar version 2.3.0
Traffic: 859 users visited in the last hour