Matplotlib 2×2子图x、y刻度未按预期生效,如何解决?
修复相连子图的独立刻度设置问题
我帮你找到问题所在啦,你的代码里有两个核心问题导致刻度设置不生效且重叠:
- 共享轴覆盖了单独的刻度设置:你用了
sharex=True和sharey=True,这会让所有子图共享同一个坐标轴实例。后续调用set_xticks/set_yticks时,共享轴的联动机制会覆盖你的单独设置,等于白忙活~ - 缺少重复刻度的隐藏处理:即使去掉共享轴,紧密相连的子图(
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
相关产品推荐
相关产品推荐

