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

Matplotlib 2×2子图x、y刻度未按预期生效,如何解决?

修复相连子图的独立刻度设置问题

我帮你找到问题所在啦,你的代码里有两个核心问题导致刻度设置不生效且重叠:

  1. 共享轴覆盖了单独的刻度设置:你用了sharex=True和sharey=True,这会让所有子图共享同一个坐标轴实例。后续调用set_xticks/set_yticks时,共享轴的联动机制会覆盖你的单独设置,等于白忙活~
  2. 缺少重复刻度的隐藏处理:即使去掉共享轴,紧密相连的子图(wspace=0/hspace=0)会让相邻子图的边缘刻度重叠,需要手动隐藏这些重复的刻度元素。

以下是修复后的完整代码,我还补上了你代码里未定义的x变量:

import numpy as np
from matplotlib import pyplot as plt

# 定义数据和刻度
x = np.linspace(0, 4, 100)  # 补上缺失的x数据
x_bounds = [0, 4]
x1_ticks = np.arange(4)      # [0,1,2,3]
x2_ticks = np.arange(1,5)    # 调整为[1,2,3,4]避免和左子图的0重叠,你也可以保留原[0,1,2,3,4],但要隐藏左刻度

y_bounds = [0, 8]
y1_ticks = np.arange(9)      # [0-8]
y2_ticks = np.arange(1,8)    # 同理调整避免重叠,也可保留原刻度后隐藏顶部

# 去掉sharex和sharey,让每个子图有独立坐标轴
fig, ((ax11, ax12), (ax21, ax22)) = plt.subplots(2, 2, figsize=[8, 8])
fig.subplots_adjust(wspace=0, hspace=0)  # 保持子图紧密相连

# 绘制图形
ax11.plot(x, x)
ax12.plot(x, np.sqrt(x))
ax21.plot(x, x**2)
ax22.plot(x, np.exp(x))

# -------------------------- 关键:单独设置刻度并隐藏重复刻度 --------------------------
# 左列子图(ax11, ax21)的x轴设置
ax11.set_xticks(x1_ticks)
ax11.set_xlim(x_bounds)
ax11.tick_params(axis='x', which='both', right=False)  # 隐藏右侧刻度线和标签
ax21.set_xticks(x1_ticks)
ax21.set_xlim(x_bounds)
ax21.tick_params(axis='x', which='both', right=False)

# 右列子图(ax12, ax22)的x轴设置
ax12.set_xticks(x2_ticks)
ax12.set_xlim(x_bounds)
ax12.tick_params(axis='x', which='both', left=False)   # 隐藏左侧刻度线和标签
ax22.set_xticks(x2_ticks)
ax22.set_xlim(x_bounds)
ax22.tick_params(axis='x', which='both', left=False)

# 上行子图(ax11, ax12)的y轴设置
ax11.set_yticks(y1_ticks)
ax11.set_ylim(y_bounds)
ax11.tick_params(axis='y', which='both', bottom=False) # 隐藏底部刻度线和标签
ax12.set_yticks(y1_ticks)
ax12.set_ylim(y_bounds)
ax12.tick_params(axis='y', which='both', bottom=False)

# 下行子图(ax21, ax22)的y轴设置
ax21.set_yticks(y2_ticks)
ax21.set_ylim(y_bounds)
ax21.tick_params(axis='y', which='both', top=False)    # 隐藏顶部刻度线和标签
ax22.set_yticks(y2_ticks)
ax22.set_ylim(y_bounds)
ax22.tick_params(axis='y', which='both', top=False)

plt.show()

关键改动说明:

  • 移除了sharex=True和sharey=True,让每个子图拥有独立的坐标轴控制权;
  • 用tick_params方法隐藏相邻子图的重复刻度(比如左列子图隐藏右侧x刻度,右列子图隐藏左侧x刻度),彻底解决重叠问题;
  • 我微调了x2_ticks和y2_ticks的范围(从1开始),你也可以保留原刻度值,只要配合tick_params隐藏重复的边缘刻度即可,效果一样;
  • 补上了缺失的x数据,确保代码能正常运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 10:22:54