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
相关产品推荐
相关产品推荐

