【问题标题】:How to use the same colorbar for seaborn heatmaps?如何为 seaborn 热图使用相同的颜色条?
【发布时间】:2022-01-27 15:27:53
【问题描述】:

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

我将热图绘制如下:

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,显然颜色将对应于前两个子图的错误值。

如何设置我的子图只包含一个适用于所有子图的颜色条,而不是三个?抱歉,数据不足,现阶段无法分享。

【问题讨论】:

    标签: python matplotlib seaborn visualization


    【解决方案1】:

    我想要一个包含 0-37 范围的颜色条,但如果我只是执行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创建一个最小/最大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()) 
    

    【讨论】:

      猜你喜欢
      • 2018-05-07
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-06
      • 2016-04-21
      • 2021-07-06
      相关资源
      最近更新 更多