3

Is it possible to run seaborn.clustermap on a previously obtained ClusterGrid object?

For example I user clustermap to obtain g in the following example:

import seaborn as ns
data = sns.load_dataset("iris")
species = iris.pop("species")

g = sns.clustermap(
    data, 
    cmap="mako",
    col_cluster=False,
    yticklabels=False, figsize=(5, 10),
    method='ward',
    metric="euclidean"
)

I would like to try different visualization options like different colormaps, figure sizes, how it looks with and without labels etc.

With the iris dataset everything is really fast, but I have a way larger dataset and the clustering part takes a lot of time.

Can I use g to show the heatmap and dendrogram using different options?

lucacerone
  • 9,859
  • 13
  • 52
  • 80

1 Answers1

4

the object returned by clustermap is of type ClusterGrid. That object is not really documented in seaborn, however, it is essentially just a container for a few Axes objects. Depending on the kind of manipulations you want to make, you may simply need to access the relevant Axes object or the figure itself:

# change the figure size after the fact
g.fig.set_size_inches((4,4))
# remove the labels of the heatmap
g.ax_heatmap.set_xticklabels([])

The colormap thing is a little more difficult to access. clustermap uses matplotlib pcolormesh under the hood. This function returns a collection object (QuadMesh), which is store in the list of collections of the main axes (g.ax_heatmap.collections). Since, AFAIK, seaborn doesn't plot anything else on that axes, We can get the QuadMesh object by its index [0], and then we can use any function applicable to that object.

# change the colormap used
g.ax_heatmap.collections[0].set_cmap('seismic')
Diziet Asahi
  • 38,379
  • 7
  • 60
  • 75
  • To define your own colormap, e.g. a diverging colormap for correlated features, you can use ```from matplotlib.colors import ListedColormap; wanted_cmap = ListedColormap(sns.diverging_palette(240, 10, n=9)); g.ax_heatmap.collections[0].set_cmap(wanted_cmap)``` – philmaweb Sep 23 '20 at 22:25