一个colorbar用于subplot中的seaborn heatmaps

pbr*_*ach 19 python matplotlib heatmap seaborn

这是一个显示每个子图的颜色条的示例:

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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

如何删除每个子图的颜色条?我想只有一个垂直或水平方向的颜色条.我知道我可以访问每个颜色条轴fig.get_axes()[:-4],但是如何从图中完全删除它们呢?我不认为在调用热图时可以选择不绘制颜色条.

mwa*_*kom 38

cbar参数控制是否应添加颜色条,cbar_ax参数可以选择指定颜色条应该到达的轴.所以,你可以这样做:

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])
Run Code Online (Sandbox Code Playgroud)

(你会tight_layout在这里得到一个警告,但它实际上是正确的,因为我们cbar_ax明确地放置了.如果你不喜欢看到警告,你也可以tight_layout在绘图之前打电话,但它不会那么紧张).

  • @bayer,是的,它同步颜色,“vmin=0”和“vmax=1”负责处理这个问题 (5认同)
  • 好点子.你需要指定`vmin`和`vmax` (3认同)
  • 你确定这也会同步颜色吗?我看到它的方式只会绘制第一个轴的色彩图,但色彩图不一定与其他轴兼容. (2认同)

Tim*_*Tim 6

实际上没有必要将cbar_ax前 3 个子图设置为 none。您可以cbar_ax=cbar_ax对所有 4 个子图进行设置,它只会在完全相同的位置绘制颜色条 4 次,这根本不会影响外观。

这对于使用 FacetGrid 的人来说效果更好,例如给定一个数据框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'})
Run Code Online (Sandbox Code Playgroud)