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

Matplotlib中set_xlim下X轴上下次要刻度异常问题

问题

为提升可视化效果,尝试在X轴上下两侧添加次要刻度标签时遇到两个问题:

  • 仅使用AutoMinorLocator(10)时,第二个子图无法生成次要刻度标签;
  • 对axs[0]设置axs[0].set_xticks([2, 1, 0, -1, -2], minor=True)后,虽能显示次要刻度,但标签变为1、1.5、2、2.5,而非预期的1、2。

原代码

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.ticker import AutoMinorLocator

x1 = np.linspace(2, -2, 5)
y1 = np.linspace(-2, 2, 5)

x2 = np.linspace(1, -5, 7)
y2 = np.linspace(-5, 1, 7)

fig, axs = plt.subplots(2, 1, figsize=(14, 10))
fig.suptitle('With minor x ticks')

# plot 1 (a)
axs[0].plot(x1, y1)
axs[0].set_ylim(-2, 2)
axs[0].set_xlim(2, -2)
axs[0].set_xticks([2, 1, 0, -1, -2], minor=True)
axs[0].set_yticks([-2, -1, 0, 1, 2])
axs[0].set_box_aspect(1)

# plot 1 (b)
axs[1].plot(x2, y2)
axs[1].set_ylim(-5, 1)
axs[1].set_ylim(1, -5)
axs[1].set_xticks([1, 0, -1, -2, -3, -4, -5], minor=True)
axs[1].set_yticks([-5, -4, -3, -2, -1, 0, 1])
axs[1].set_box_aspect(1)

for i in range(2):
    axs[i].yaxis.set_minor_locator(AutoMinorLocator(10))
    axs[i].xaxis.set_minor_locator(AutoMinorLocator(10))
    axs[i].yaxis.set_ticks_position('both')
    axs[i].xaxis.set_ticks_position('both')
    axs[i].tick_params(axis='both', which='both', direction='in')
plt.show()
fig.savefig("fig1_with minor.pdf")

效果截图

当前可视化效果

解决方案

问题核心是主次刻度设置混淆:你想要显示标签的1、2等刻度应该是主刻度,但代码里误将其设为次要刻度,之后又用AutoMinorLocator覆盖了次要刻度配置,导致逻辑混乱。

修改步骤

  1. 修正主次刻度定义:把原来设置minor=True的set_xticks改为主刻度(去掉minor=True参数),这些是需要显示标签的刻度;
  2. 调整AutoMinorLocator参数:根据主刻度的间隔设置分割数,比如主刻度间隔为1时,AutoMinorLocator(2)会在每个主刻度之间生成1个次要刻度;若需要更多次要刻度,可增大参数值;
  3. 统一配置逻辑:确保主次刻度的设置不互相覆盖,先定义主刻度,再用定位器设置次要刻度。

修改后的代码

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.ticker import AutoMinorLocator

x1 = np.linspace(2, -2, 5)
y1 = np.linspace(-2, 2, 5)

x2 = np.linspace(1, -5, 7)
y2 = np.linspace(-5, 1, 7)

fig, axs = plt.subplots(2, 1, figsize=(14, 10))
fig.suptitle('With minor x ticks')

# plot 1 (a)
axs[0].plot(x1, y1)
axs[0].set_ylim(-2, 2)
axs[0].set_xlim(2, -2)
# 将原次要刻度改为主刻度
axs[0].set_xticks([2, 1, 0, -1, -2])
axs[0].set_yticks([-2, -1, 0, 1, 2])
axs[0].set_box_aspect(1)

# plot 1 (b)
axs[1].plot(x2, y2)
axs[1].set_ylim(1, -5)
# 将原次要刻度改为主刻度
axs[1].set_xticks([1, 0, -1, -2, -3, -4, -5])
axs[1].set_yticks([-5, -4, -3, -2, -1, 0, 1])
axs[1].set_box_aspect(1)

for i in range(2):
    # 根据主刻度间隔调整次要刻度分割数,主间隔为1时,设为2则每个间隔1个次要刻度
    axs[i].yaxis.set_minor_locator(AutoMinorLocator(2))
    axs[i].xaxis.set_minor_locator(AutoMinorLocator(2))
    axs[i].yaxis.set_ticks_position('both')
    axs[i].xaxis.set_ticks_position('both')
    # 可选:若需要显示次要刻度标签,取消以下注释
    # axs[i].tick_params(axis='x', which='minor', labelbottom=True, labeltop=True)
    axs[i].tick_params(axis='both', which='both', direction='in')
plt.show()
fig.savefig("fig1_with minor.pdf")

说明

  • 修改后,主刻度显示你预期的1、2等标签,次要刻度在主刻度之间生成;
  • 若需要显示次要刻度的标签,取消注释代码中tick_params的相关配置即可;
  • AutoMinorLocator的参数表示主刻度之间的分割份数,比如参数为2时,主刻度间有1个次要刻度;参数为5时,主刻度间有4个次要刻度,可按需调整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 03:25:19