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

Matplotlib中对数-对数图大Y轴范围下显示所有Y轴次刻度

解决Matplotlib对数-对数图Y轴次刻度不显示问题

你当前代码的核心问题是误用了线性刻度定位器MultipleLocator来配置对数轴的次刻度,这在对数坐标系下完全不适用。对数轴的次刻度需要用LogLocator来处理,它能正确识别对数区间内的次刻度位置。

修正后的完整代码

import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.ticker as tck

# 创建绘图对象
fig = plt.figure(figsize=(6, 5))
ax = fig.add_subplot(111)

# 设置刻度样式
ax.tick_params(which='major', direction='in', width=2, length=7, top=True, right=True, pad=10)
ax.tick_params(which='minor', direction='in', width=1, length=5, top=True, right=True)

plt.xticks(fontsize=18)
plt.yticks(fontsize=18)

# X轴次刻度配置(AutoMinorLocator对对数轴也兼容)
ax.xaxis.set_minor_locator(tck.AutoMinorLocator())

# 关键修正:用LogLocator配置Y轴主、次刻度
# 主刻度:覆盖Y轴范围的10的幂次
locmaj = tck.LogLocator(base=10, numticks=12)
ax.yaxis.set_major_locator(locmaj)
# 次刻度:在每个主刻度区间内生成2-9倍的刻度线
locmin = tck.LogLocator(base=10, subs='all', numticks=12)
ax.yaxis.set_minor_locator(locmin)

# 设置刻度格式化器,适配科学计数法显示
ax.yaxis.set_major_formatter(tck.LogFormatter())
# 控制次刻度标签显示逻辑,避免过度密集
ax.yaxis.set_minor_formatter(tck.LogFormatter(minor_thresholds=(2, 0.2)))

# 绘制数据曲线
col = ['dodgerblue']
data = np.array([[1.e-1, 4.e-37], [1.e+1, 1.e-33], [1.e+3, 7.e-26]])
plt.loglog(data[:, 0], data[:, 1], col[0], linewidth=2.5)

# 设置坐标轴标签与范围
plt.ylabel(r'$y$', fontsize=22)
plt.xlabel(r'$x$', fontsize=22)
plt.ylim(1e-37, 1e-25)
plt.xlim(0.1, 10000)

plt.show()

关键修改说明

  • 替换MultipleLocator为LogLocator(base=10, subs='all'):subs='all'会让Matplotlib自动在每个10的幂次区间内生成2、3…9倍的次刻度,完美匹配对数轴的刻度逻辑。
  • 优化次刻度格式化器:minor_thresholds=(2, 0.2)参数可以控制次刻度标签的显示时机,避免因标签过于密集影响图表可读性;如果只需要显示次刻度线、不需要标签,可替换为tck.NullFormatter()。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 09:55:28