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

使用LogLocator时semilogx图主网格线显示异常求助

解决Semilogx图主网格线间隔问题与轴标签对齐问题

问题原因

  1. 主网格线间隔异常:手动设置的LogLocator默认numticks参数值较小(默认是5),导致Matplotlib自动跳过部分十年刻度的主网格线,仅显示间隔刻度。
  2. 轴标签高度不一致:X轴刻度自动混用普通数字格式(如10、100)和科学计数格式(如1e3),不同格式的文字基线不同,造成视觉上的高度差异。

解决代码

修改后的完整代码如下:

import matplotlib.pyplot as plt
from matplotlib.ticker import (MultipleLocator, LogLocator, ScalarFormatter)

# configuration
xValues = [0.1, 1, 10, 100, 1e3, 10e3, 100e3, 1e6, 10e6, 100e6]
yValues = [-70, -95,  -135, -165, -175, -180, -180, -180, -180, -180]

# plot 
fig = plt.figure(1, figsize=[10, 5], dpi=150)
ax = fig.subplots(1,1)

plt.semilogx(xValues, yValues)
plt.minorticks_on()

ax.yaxis.set_major_locator(MultipleLocator(10))
ax.yaxis.set_minor_locator(MultipleLocator(5))
# 修改主刻度定位器,设置足够大的numticks以显示所有十年刻度
ax.xaxis.set_major_locator(LogLocator(base=10.0, numticks=10))
ax.xaxis.set_minor_locator(LogLocator(base=10.0, subs=(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9), numticks=72))

# 设置X轴主刻度格式,统一为非科学计数格式,解决标签高度不一致问题
ax.xaxis.set_major_formatter(ScalarFormatter(useMathText=False))
ax.xaxis.get_major_formatter().set_scientific(False)
ax.xaxis.get_major_formatter().set_useOffset(False)

plt.grid(True, axis='both', which='major', linestyle="-", linewidth=0.8, color=(0.6, 0.6, 0.6))
plt.grid(True, axis='both', which='minor', linestyle="-", linewidth=0.5, color=(0.9, 0.9, 0.9))

plt.tight_layout()
plt.show()

关键修改点

  • 主网格线修复:在LogLocator中添加numticks=10,确保覆盖X轴从0.1到1e8的所有十年刻度(共9个主刻度,设置numticks大于该数量即可)。
  • 轴标签对齐修复:使用ScalarFormatter并关闭科学计数和偏移量,让所有X轴刻度标签以普通数字形式显示(如1000而非1e3),保证所有标签基线一致,视觉对齐。

如果偏好科学计数格式的标签,可以替换格式器为:

from matplotlib.ticker import StrMethodFormatter
ax.xaxis.set_major_formatter(StrMethodFormatter("{x:.0e}"))

这样所有标签会统一显示为1e-1、1e0、1e1等格式,同样能保证高度一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 16:10:40