Question: Complex Heatmap: Changing order of clusters
gravatar for yomogy
7 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 • 1.7k views
ADD COMMENTlink modified 7 months ago by Kevin Blighe32k • written 7 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 7 months ago • written 7 months ago by genomax58k
gravatar for Kevin Blighe
7 months ago by
Kevin Blighe32k
Republic of Ireland
Kevin Blighe32k 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 written 7 months ago by Kevin Blighe32k

Thanks Kevin, it works perfecctly!!

ADD REPLYlink written 7 months ago by yomogy90

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

ADD REPLYlink written 7 months ago by Kevin Blighe32k

Thanks Kevin, this is very useful code.

ADD REPLYlink written 7 months ago by Mike1.1k
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: 1201 users visited in the last hour