【问题标题】:One colorbar for seaborn heatmaps in subplot子图中 seaborn 热图的一个颜色条
【发布时间】:2015-04-06 00:57:19
【问题描述】:

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

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)

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

【问题讨论】:

    标签: python matplotlib heatmap seaborn


    【解决方案1】:

    实际上没有必要将前 3 个子图的 cbar_ax 设置为 none。您可以为所有 4 个子图设置 cbar_ax=cbar_ax,它只会在完全相同的位置绘制颜色条 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'})
    

    【讨论】:

      【解决方案2】:

      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])
      

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

      【讨论】:

      • 很好的解决方案。这很有帮助。谢谢。
      • 你确定这也会同步颜色吗?我看到它只会绘制第一个轴的颜色图,但颜色图不一定与其他轴兼容。
      • 这部分是做什么的cbar=i == 0?分配然后与 0 比较?为什么?
      • @Rotkiv,这实际上是设置cbar等于i == 0,即cbar = True如果i == 0返回True
      • @bayer,是的,它会同步颜色,vmin=0vmax=1 负责处理
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-07
      • 2020-06-21
      • 2021-04-30
      • 1970-01-01
      • 2018-05-09
      • 1970-01-01
      • 2021-07-06
      相关资源
      最近更新 更多