如何修改matplotlib的x轴刻度显示,实现不同数值区间自定义格式化
解决方案
你可以通过matplotlib的FuncFormatter自定义刻度格式化规则,实现分区间的刻度展示需求。
完整可运行代码
import numpy as np import matplotlib.pyplot as plt from matplotlib.ticker import FuncFormatter # 自定义刻度格式化函数 def format_x_tick(x, pos): # 0~0.09区间使用幂次格式 if x < 0.1: # 格式化为科学计数法,去掉多余尾部0 return f"{x:.0e}" # 0.1~20区间移除多余小数位 else: # g格式自动去掉末尾的0和冗余小数点 return f"{x:.10g}" x = sorted([0.09, 20, 0.6, 6, 0.05, 0.5, 0.4, 4, 0.3, 3, 2, 0.1, 0.2, 0.9, 0.8, 10, 0.7, 1, 0.08, 0.07, 0.06, 0.04, 0.03, 0.02, 0.01, 0.005]) y = list(np.arange(0.0, 2.6, 0.1)) plt.plot(x, y) plt.xscale('log', base=10) ax = plt.gca() # 替换原ScalarFormatter为自定义格式化器 ax.xaxis.set_major_formatter(FuncFormatter(format_x_tick)) ax.set_xticks(x) plt.xticks(fontsize=6) plt.grid() plt.show()
关键逻辑说明
- 自定义格式化函数接收两个参数:
x为刻度值,pos为刻度位置(本需求无需使用该参数) - 小于0.1的刻度值直接用科学计数法格式化,
.0e表示保留0位小数的科学计数法,输出形如1e-2、5e-3 - 大于等于0.1的刻度值使用
.10g格式,会自动省略末尾的无效0和冗余小数点,满足0.10转0.1、2.00转2的需求
如果需要调整科学计数法的展示形式(比如改为10^-2上标格式),可以将格式化返回值调整为LaTeX格式,修改对应返回语句为:
return rf"$10^{{{int(np.log10(x))}}}$"
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

