如何为 seaborn 热图使用相同的颜色条?

How to use the same colorbar for seaborn heatmaps?

我有三个子图,单独绘制时颜色条略有不同

我绘制的热图如下:

fig, axes = plt.subplots(nrows=1, ncols=3, figsize = (20,10),sharey=True)

sns.heatmap(df,cmap=colormap,ax = axes[0])
sns.heatmap(df2,cmap=colormap,ax = axes[1])
sns.heatmap(df3,cmap=colormap,ax = axes[2])

我知道我可以为前两个图设置 cbar = False,但是由于它们的颜色条略有不同,第三个颜色条不会代表所有子图。我的第一个子图的范围是 0-35,第二个是 0-36,第三个是 0-37。我想要一个包含 0-37 范围的颜色条,但显然如果我只做 cbar = False.

,颜色将对应于前两个子图的错误值

我如何设置我的子图以仅包含一个适用于所有子图的颜色条,而不是三个?很抱歉缺少数字,我现阶段无法分享它们。

I want a colorbar that encompasses the 0-37 range but obviously the colors will correspond to the wrong values for the first two subplots if I just do cbar=False.

除了在前两个热图上设置 cbar=False 之外,将所有热图锚定到相同的颜色图范围:

  • 在每个热图上设置 vminvmax

    sns.heatmap(df,  ax=axes[0], vmin=0, vmax=37, cbar=False)
    sns.heatmap(df2, ax=axes[1], vmin=0, vmax=37, cbar=False)
    sns.heatmap(df3, ax=axes[2], vmin=0, vmax=37)
    #                            ^       ^
    
  • 或使用 matplotlib.colors.Normalize 创建 min/max norm:

    import matplotlib.colors as mcolors
    norm = mcolors.Normalize(0, 37)
    
    sns.heatmap(df,  ax=axes[0], norm=norm, cbar=False)
    sns.heatmap(df2, ax=axes[1], norm=norm, cbar=False)
    sns.heatmap(df3, ax=axes[2], norm=norm)
    #                            ^
    

注意,如果你想自动提取vminvmaxravelstack数据:

values = np.hstack([d.values.ravel() for d in [df, df2, df3]])
norm = mcolors.Normalize(values.min(), values.max())