Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

One colorbar for seaborn heatmaps in subplot

Here is an example that shows a colorbar for each subplot:

import seaborn as sns import matplotlib.pyplot as plt import pandas as pd import numpy as np  df = pd.DataFrame(np.random.random((10,10,)))  fig,axn = plt.subplots(2, 2, sharex=True, sharey=True)  for ax in axn.flat:     sns.heatmap(df, ax=ax) 

enter image description here

How can I remove the colorbars for each subplot? I'd like to have only one colorbar that is either vertically or horizontally oriented. I know I have access to each colorbar axes via fig.get_axes()[:-4], but how can I remove it from them entirely from the plot? I don't think there is an option to opt out of drawing the colorbar when heatmap is called.

like image 915
pbreach Avatar asked Feb 06 '15 00:02

pbreach


People also ask

How do I change my color palette in Seaborn heatmap?

You can change the color of the seaborn heatmap by using the color map using the cmap attribute of the heatmap.

How do you combine heatmaps?

To concatenate heatmaps, simply use + operator. Under default mode, dendrograms from the second heatmap will be removed and row orders will be the same as the first one. Also row names for the first two heatmaps are removed as well. The returned value of the concatenation is a HeatmapList object.


2 Answers

The cbar parameter controls whether a colorbar should be added, and the cbar_ax parameter can optionally specify the axes where the colorbar should go. So, you could do:

import seaborn as sns import matplotlib.pyplot as plt import pandas as pd import numpy as np  df = pd.DataFrame(np.random.random((10,10,)))  fig, axn = plt.subplots(2, 2, sharex=True, sharey=True) cbar_ax = fig.add_axes([.91, .3, .03, .4])  for i, ax in enumerate(axn.flat):     sns.heatmap(df, ax=ax,                 cbar=i == 0,                 vmin=0, vmax=1,                 cbar_ax=None if i else cbar_ax)  fig.tight_layout(rect=[0, 0, .9, 1]) 

(You'll get a warning about tight_layout here, but it actually is correct because we placed cbar_ax explicitly. If you don't like seeing the warning, you can also call tight_layout before plotting, but it won't be as tight).

like image 103
mwaskom Avatar answered Oct 14 '22 15:10

mwaskom


It's actually not necessary to set cbar_ax to none for the first 3 subplots. You can set cbar_ax=cbar_ax for all 4 subplots and it will just paint the colorbar in the exact same spot 4 times, which dones't affect the look at all.

This works better for those using FacetGrid, e.g. given a dataframe df:

def draw_heatmap(*args, **kwargs):     data = kwargs.pop('data')     d = data.pivot(index=args[1], columns=args[0], values=args[2])     sns.heatmap(d, **kwargs)  g = sns.FacetGrid(df, col='col_name', col_wrap=2, margin_titles=True, sharey=True)  cbar_ax = g.fig.add_axes([.91, .15, .03, .7]) g = g.map_dataframe(draw_heatmap, 'col_col', 'index_col', 'val_col', annot=True,                      cmap='Spectral', cbar_ax=cbar_ax, cbar_kws={'label': 'color_bar_label'}) 
like image 30
Tim Avatar answered Oct 14 '22 15:10

Tim