So right now my observations in the dataset I've processed is stored as sample identifier columns and gene rows: an example of this would be for sample 1 and gene TRIM21 the observation is Missense Mutation;Frame Shift Deletion. I'm having issues separating the two alterations and instead of being able to show the gene in the sample having 2 different alterations, I end up having to generate a new colour classification (being that the gene in the specific sample exhibits specifically both a missense mutation and a frame shift deletion instead of being able to represent the observation with just colours and missense and frame shift deletion colours alone). Here is an a screenshot of what my matrix looks like: enter image description here

As an example here is some test code generating the test plot:


test_labels <- c("Missense_Mutation", "Splice_Site", "Frame_Shift_Del",
                 "Splice_Region","Missense_Mutation;Splice_Site", "Splice_Site;Frame_Shift_Del", 
                 "Splice_Site;Missense_Mutation", "Frame_Shift_Del;Splice_Site")

plot <- Heatmap(test, row_names_side = "left",
        row_names_gp = gpar(cex = 0.7), 
        column_names_gp = gpar(cex = 0.7), 
        heatmap_legend_param = list(title = "Alterations", 
                                    at = test_labels, labels = test_labels), show_heatmap_legend = TRUE)


I've attached a screenshot of my actual plot and as you will be able to see, this ends up creating multiple different classifications: enter image description here

  • $\begingroup$ Dear John, I am sure your post makes sense to someone, but makes little sense to me. I can see in your tags you are using Bioconductor ... that is a good start. Perhaps you can post your code and explain the data set. I see that the red is stuff you don' twant us to see $\endgroup$
    – M__
    Commented Jul 1, 2020 at 21:52
  • 1
    $\begingroup$ Hi Michael, thanks for responding! This is specific to a package in Bioconductor: jokergoo.github.io/ComplexHeatmap-reference/book/index.html. I would add my code, but I would also need to provide the exact dataset as well as the data processing I've already done, which is a decently long script. Essentially, the data set is represents samples (columns) and genes (rows), and observations correspond to what the alteration present in the specific gene in the specific patient sample. As you can see, sometimes observations are separated by ";". $\endgroup$ Commented Jul 1, 2020 at 22:27
  • $\begingroup$ This is a pretty specific question I realize, as I am using the Heatmap function in the vignette and it doesn't exactly cover how I'd be able to parse what I'd like to. $\endgroup$ Commented Jul 1, 2020 at 22:28
  • $\begingroup$ Thanks. Don't need to provide your data set ... a dumbie data set is fine - we understand patient confidentiality issues. Putting some code there would be useful. $\endgroup$
    – M__
    Commented Jul 1, 2020 at 22:29
  • 1
    $\begingroup$ I've updated my question with some sample code! You'll see in the legend, e.g. "Missense_Mutation;Splice_Site" is given its own category instead of being recognized separately as "Missense_Mutation" and "Splice_Site". $\endgroup$ Commented Jul 1, 2020 at 22:49

1 Answer 1


What is fed into ComplexHeatmap is what it outputs! So if one of your genes has a Missense_Mutation as well as a Frame_Shift_Del and you would like to plot its value, of course you will have a category and color that is different than those of Missense_Mutation or Frame_Shift_Del, that is only natural.

What you can do is to create additional variables like your_gene_Missense_Mutation or your_gene_Frame_Shift_Del each with 0 or 1 to indicate if a particular mutation type is present or not for a particular gene (you can think of it like one-hot-encoding). With a lot of different levels, the resulting heatmap could be difficult to interpret though.

Another simpler alternative would be a using a "universal label" if your gene has multiple mutations. Basically if the cell contains a ;, its value will be changed to something like mixed_mutation_status and instead of multiple "mutation_type_1; mutation_type_2; ... like categories, you will just have one mixed_mutation_status on top of Missense_Mutation, Frame_Shift_Del, ...

  • $\begingroup$ The mixed_mutation_status is indeed how maftools does it - it calls it multi-hit. Although, in this case, the same mutation can be both missense and splice_site if it's a mutation at an exonic spllice site. OP should first pick among the many possible consequences of a mutation wherever possible, and then apply a logic where multiple mutations still exist in the same gene. $\endgroup$
    – Ram RS
    Commented Jul 3, 2020 at 16:26

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.