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

Matplotlib绘制大数值范围图:保留全网格线仅显示部分刻度标签

解决方案

要实现显示全部网格线但仅保留10的整数次幂刻度标签的对数图表,核心是分开控制网格线渲染和刻度标签显示,具体思路和代码如下:

核心思路

  • 网格线:开启主、次两级网格线,确保覆盖所有刻度位置;
  • 刻度标签:仅保留10的整数次幂(主刻度)的标签,隐藏次刻度的标签——次刻度仅用于生成网格线,不显示文字。

修改后的代码

import numpy as np
from matplotlib import pyplot as plt

start = 1e-6
stop = 1e14
# 用numpy向量化方法生成x轴数据,替代循环更高效
I_out_tab = np.logspace(np.log10(start), np.log10(stop), 1000)
y = 2 * I_out_tab ** 3  # 直接计算y值,无需循环

plt.loglog(I_out_tab, y)

# 显示所有主、次网格线
plt.grid(True, which="both", ls="-")

ax = plt.gca()

# 主刻度:仅在10的整数次幂位置生成刻度,并用科学计数法显示标签
ax.xaxis.set_major_locator(plt.LogLocator(base=10, subs=[1], numticks=21))
ax.xaxis.set_major_formatter(plt.LogFormatterSciNotation())

# 次刻度:生成每个数量级内2-9倍的刻度(对应次网格线),但隐藏标签
ax.xaxis.set_minor_locator(plt.LogLocator(base=10, subs=np.arange(2,10), numticks=100))
ax.xaxis.set_minor_formatter(plt.NullFormatter())

plt.show()

关键细节说明

  1. 网格线设置:plt.grid(True, which="both", ls="-")中的which="both"会同时渲染主网格线(对应10的整数次幂)和次网格线(对应每个数量级内的2-9倍位置),确保网格覆盖整个数值范围。
  2. 主刻度控制:LogLocator(base=10, subs=[1])指定仅在10的整数次幂处生成主刻度,numticks=21是因为从10-6到1014共有21个整数次幂(-6、-5...14),保证所有需要的主刻度都显示。LogFormatterSciNotation()让标签以1e-6、1e-5这种规范的科学计数法呈现,适配论文图表要求。
  3. 次刻度控制:LogLocator(base=10, subs=np.arange(2,10))生成每个数量级内2、3...9倍的次刻度,这些刻度会自动对应次网格线;NullFormatter()则隐藏次刻度的文字标签,避免图表过于拥挤。

内容的提问来源于stack exchange,提问作者Michał Rękawek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 10:55:05