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.
https://ibb.co/jqGb77

<a href="https://ibb.co/jqGb77"><img src="https://preview.ibb.co/dRB9S7/Heat_map.png" alt="Heat map" border="0" /></a>

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 ?

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)
    kclus$cluster
     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, cluster_row_slices = FALSE)

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, cluster_row_slices = FALSE)

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)
      upViewport()
    
      pushViewport(viewport(layout.pos.row=1, layout.pos.col=2))
        draw(reorder.hmap, newpage=FALSE)
      upViewport()

    upViewport()
<a href="https://ibb.co/b9vRqS"><img src="https://preview.ibb.co/guQ4c7/ghghg.png" alt="ghghg" border="0"></a>





