You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Seaborn子图布局调整:如何将20个热力图拆分为4行5列并统一配置颜色条

解决多行热力图布局与共享颜色条问题

Got it, let's fix this layout issue for you! The core problem with your original code is that you're arranging all plots in a single row—we'll switch to a grid layout and use matplotlib's gridspec to reserve space for a shared colorbar that spans all rows.

Step-by-Step Solution

First, let's break down how to structure the layout and simplify your repetitive code (no need to write 10+ separate heatmap calls!). We'll start with your 10-plot example (2 rows × 5 columns), then extend it to 20 plots (4 rows ×5 columns).

1. 10 Heatmaps (2 Rows × 5 Columns)

Here's a clean, reusable implementation:

import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

# 模拟你的相关性矩阵(替换成你实际的subjective_corr1~subjective_corr11)
corr_matrices = [np.random.rand(5,5)*2 - 1 for _ in range(10)]

# 定义布局参数
n_rows = 2
n_cols = 5

# 创建画布:n_rows行,n_cols+1列(最后一列留给颜色条)
fig, axes = plt.subplots(
    n_rows, n_cols+1,
    gridspec_kw={'width_ratios': [1]*n_cols + [0.08]}  # 颜色条列宽度更小
)

# 获取跨所有行的颜色条轴
cbar_ax = axes[:, -1].ravel()[0]

# 循环绘制每个热力图
for idx, ax in enumerate(axes[:, :-1].ravel()):
    corr_mat = corr_matrices[idx]
    
    # 只有最后一个热力图绘制颜色条,指定到共享的cbar_ax
    sns.heatmap(
        corr_mat,
        vmin=-1, vmax=1,
        cmap='coolwarm',
        annot=True,
        cbar=(idx == len(corr_matrices)-1),
        cbar_ax=cbar_ax,
        ax=ax
    )
    
    # 统一设置标签和刻度:仅保留每一行第一列的y轴刻度
    ax.set_ylabel("")
    ax.set_xlabel("")
    if ax.get_subplotspec().col != 0:
        ax.set_yticks([])

# 调整布局避免重叠
plt.tight_layout()
plt.show()

2. 20 Heatmaps (4 Rows ×5 Columns)

Just update the layout parameters—everything else stays the same:

# 模拟20个相关性矩阵
corr_matrices_20 = [np.random.rand(5,5)*2 -1 for _ in range(20)]

n_rows = 4
n_cols = 5

fig, axes = plt.subplots(
    n_rows, n_cols+1,
    gridspec_kw={'width_ratios': [1]*n_cols + [0.08]}
)

cbar_ax = axes[:, -1].ravel()[0]

for idx, ax in enumerate(axes[:, :-1].ravel()):
    corr_mat = corr_matrices_20[idx]
    sns.heatmap(
        corr_mat,
        vmin=-1, vmax=1,
        cmap='coolwarm',
        annot=True,
        cbar=(idx == len(corr_matrices_20)-1),
        cbar_ax=cbar_ax,
        ax=ax
    )
    
    ax.set_ylabel("")
    ax.set_xlabel("")
    if ax.get_subplotspec().col != 0:
        ax.set_yticks([])

plt.tight_layout()
plt.show()

Key Details Explained

  • Grid Layout: We create an extra column for the colorbar, using width_ratios to make it narrower than the heatmap columns.
  • Shared Colorbar: axes[:, -1].ravel()[0] merges the last column's axes into a single vertical axis that spans all rows, so the colorbar stays aligned with all plots.
  • Reduced Repetition: Using a loop eliminates redundant code and makes it easy to scale to more plots.
  • Cleaner Ticks: Only keeping y-ticks on the first column of each row keeps the layout uncluttered while maintaining readability.

Optional: Share Y-Axes Across Rows

If you want the first column's y-axes to sync (zoom/pan together), add this before the loop:

# 共享第一列所有行的y轴
first_col_axes = axes[:, 0]
for ax in first_col_axes[1:]:
    first_col_axes[0].get_shared_y_axes().join(first_col_axes[0], ax)

内容的提问来源于stack exchange,提问作者Fllecha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 06:55:23