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

如何在4×n网格的循环生成subplot中实现Y轴共享?

解决4×n网格子图共享Y轴的简洁方案

嘿,这个问题我之前也碰到过!不用给每个子图单独命名也能轻松实现共享Y轴,咱们换个思路用plt.subplots()来创建整个子图网格就搞定了,比逐个创建子图高效太多。

核心思路

原来的代码用plt.subplot()逐个添加子图,没法统一设置共享轴;而plt.subplots()可以一次性生成整个子图网格,直接通过sharey=True参数让所有子图共享Y轴,返回的axes数组还能直接循环遍历,完全不用手动给每个子图命名。

修改后的代码

import math
import numpy as np
import matplotlib.pyplot as plt

def make_plots(df, name_list):
    n = len(name_list)
    rows = math.ceil(n / 4)  # 自动计算行数,兼容n不是4的倍数的情况
    
    # 创建子图网格,指定sharey=True实现Y轴共享
    fig, axes = plt.subplots(rows, 4, figsize=(10, 10/4 * rows), dpi=500, sharey=True)
    axes = axes.flatten()  # 将二维axes数组展平为一维,方便循环
    
    for idx, (name, ax) in enumerate(zip(name_list, axes)):
        ax.set_title(f'Table {idx+1}: {name}', size='xx-small')
        ax.grid(False)
        # 过滤大于0的数据
        a = [x for x in df[name] if x > 0]
        ax.hist(a, bins=7, rwidth=0.7)
        ax.axvline(x=np.mean(a), color='red')
    
    # 如果name_list长度不是4的倍数,隐藏多余的空白子图
    for ax in axes[n:]:
        ax.axis('off')
    
    plt.tight_layout(pad=0.2, h_pad=0.2, w_pad=0.2)
    plt.show()

关键改进点

  • 自动共享Y轴:通过plt.subplots(..., sharey=True)直接实现所有子图Y轴同步,无需手动配置每个子图
  • 简化循环逻辑:展平后的axes数组可以和name_list直接配对循环,不用手动计算子图位置(j变量)
  • 兼容非4倍数场景:用math.ceil(n/4)计算行数,同时隐藏多余的空白子图,避免布局混乱
  • 面向对象风格:使用ax.set_title()、ax.hist()等方法,比全局的plt.xxx更清晰,也更适合子图批量操作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:19:05