如何在Matplotlib对数纵轴中仅保留一次相同指数?
解决Matplotlib对数纵轴重复显示10^1的问题
原代码的问题出在自定义刻度格式化函数的判断逻辑上——它依赖刻度的位置索引(pos)来决定是否显示完整指数格式,这会导致同一指数区间内的多个刻度被错误地加上指数标识。我们需要调整逻辑,仅在刻度值为10的整数次幂时显示完整指数格式,其他同指数区间的刻度只显示数字。
修改后的代码如下:
import matplotlib.pyplot as plt import numpy as np from matplotlib.ticker import FuncFormatter # 生成数据 x = np.linspace(start=11, stop=19, num=20) y = x # 创建画布和坐标轴 fig, ax = plt.subplots() # 绘图并设置纵轴为对数刻度 ax.plot(x, y) ax.set_yscale('log') # 定义纵轴刻度的自定义格式化函数 def format_y_tick(value, pos): exponent = int(np.log10(value)) base = value / 10**exponent # 仅当base为1(即当前值是10的整数次幂)时,显示完整指数格式 if np.isclose(base, 1): # 用LaTeX格式显示10^exponent,更美观 return f'$10^{{{exponent}}}$' else: # 其他情况只显示base的整数部分 return f'{int(base)}' ax.yaxis.set_major_formatter(FuncFormatter(format_y_tick)) # 显示图表 plt.show()
关键修改点:
- 移除了原代码中基于
pos的判断逻辑,改为通过np.isclose(base, 1)判断当前刻度是否是10的整数次幂(避免浮点数精度问题) - 对10的整数次幂刻度,使用LaTeX格式
$10^{{{exponent}}}$显示,比1eX更符合对数刻度的常规视觉习惯 - 非10次幂的刻度仅显示数字部分,避免重复的指数标识
内容的提问来源于stack exchange,提问作者sunxd
相关产品推荐
相关产品推荐

