如何在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
相关产品推荐
相关产品推荐

