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

Matplotlib子图设置:为每列添加共用Y轴标签及共用X轴标签

实现Matplotlib子图列共用Y轴、全局共用X轴的方案

不需要用twinx(那是实现双Y轴的工具),用Matplotlib的网格布局配合共享轴参数就能轻松实现需求。核心思路是让同列子图共享Y轴、所有子图共享X轴,再统一设置轴标签。

方法一:用plt.subplots快速实现

这是最简洁的方式,直接通过参数指定共享规则:

import matplotlib.pyplot as plt
import numpy as np

# 生成测试数据
x = np.linspace(0, 10, 100)
y_data = [np.sin(x), np.cos(x), np.tan(x[:-10]), np.exp(-x/5)]

# 创建2行2列子图:列共用Y轴,全局共用X轴
fig, axes = plt.subplots(nrows=2, ncols=2, sharex='all', sharey='col', figsize=(10, 6))

# 批量绘制子图
for ax, y in zip(axes.flat, y_data):
    if len(y) == len(x)-10:
        ax.plot(x[:-10], y)
    else:
        ax.plot(x, y)

# 设置每列的Y轴标签(只需要给每列最上方的子图设置)
axes[0, 0].set_ylabel('正弦/余弦值')
axes[0, 1].set_ylabel('正切/指数值')

# 设置全局X轴标签(用fig.supxlabel一步到位)
fig.supxlabel('X轴数值')

# 隐藏多余的刻度标签,让布局更整洁
# 第二列子图隐藏左侧Y标签
for ax in axes[:, 1]:
    ax.yaxis.set_tick_params(labelleft=False)
# 第一行子图隐藏底部X标签
for ax in axes[:-1, :]:
    ax.xaxis.set_tick_params(labelbottom=False)

# 自动调整子图间距
plt.tight_layout()
plt.show()

关键参数说明

  • sharex='all':强制所有子图共享X轴,刻度范围、刻度值完全一致
  • sharey='col':让每一列的子图共享Y轴,同列子图的Y轴范围统一
  • fig.supxlabel():直接给整个图设置全局X轴标签,比单独给底部子图设置更省心

方法二:用gridspec自定义布局(适合复杂场景)

如果需要更灵活的子图布局比例,用gridspec手动指定共享规则:

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

x = np.linspace(0, 10, 100)
y_data = [np.sin(x), np.cos(x), np.tan(x[:-10]), np.exp(-x/5)]

fig = plt.figure(figsize=(10, 6))
# 创建2行2列的网格
gs = gridspec.GridSpec(2, 2)

# 创建子图并指定共享规则
ax1 = fig.add_subplot(gs[0, 0])
ax2 = fig.add_subplot(gs[1, 0], sharey=ax1)  # 和ax1共享Y轴
ax3 = fig.add_subplot(gs[0, 1])
ax4 = fig.add_subplot(gs[1, 1], sharey=ax3)  # 和ax3共享Y轴

# 让所有子图共享X轴
ax1.get_shared_x_axes().join(ax1, ax2, ax3, ax4)

# 绘图
ax1.plot(x, y_data[0])
ax2.plot(x, y_data[1])
ax3.plot(x[:-10], y_data[2])
ax4.plot(x, y_data[3])

# 设置标签
ax1.set_ylabel('正弦/余弦值')
ax3.set_ylabel('正切/指数值')
fig.supxlabel('X轴数值')

# 隐藏多余标签
for ax in [ax3, ax4]:
    ax.yaxis.set_tick_params(labelleft=False)
for ax in [ax1, ax3]:
    ax.xaxis.set_tick_params(labelbottom=False)

plt.tight_layout()
plt.show()

两种方法都能实现你要的效果:每列子图共用Y轴标签,所有子图共用一个X轴标签,布局整洁统一。

内容的提问来源于stack exchange,提问作者Prajwal Kumar A

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 07:15:59