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

