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)
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.
You can change the color of the seaborn heatmap by using the color map using the cmap attribute of the heatmap.
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.
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).
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'})
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With