如何强制Matplotlib轴刻度标签显示带偏移量的科学计数法?
解决Matplotlib子图刻度统一为带偏移的科学计数法格式
要让所有子图的轴刻度都采用带偏移量的科学计数法(刻度标签显示小数值,右上角标注b×10^c,刻度值a对应实际值(b+a)×10^c),可以通过强制配置ScalarFormatter参数实现,避免Matplotlib自动选择格式的不一致性。
核心解决方案
使用matplotlib.ticker.ScalarFormatter,通过以下配置强制启用带偏移的科学计数法:
- 开启
useMathText=True:让科学计数法的指数部分用美观的10^c格式显示 - 设置
set_powerlimits((-3, 3)):当数值绝对值超出10^-3到10^3范围时,强制触发带偏移的格式(你的数值远大于10^3,完全符合触发条件) - 强制
useOffset=True:确保偏移量始终显示,不会被Matplotlib自动关闭
修改后的完整代码
import matplotlib.pyplot as plt from matplotlib.ticker import ScalarFormatter targets = [[-167297.54344731, -167301.10372634, -167308.44207031, -167312.11313287],[-145434.59446349, -145430.40561915, -145432.73985156, -145432.6785802]] preds = [[-167298.46656051, -167300.59898357, -167308.72554459, -167311.71904965],[-145433.43693344, -145429.41508183, -145432.73929695, -145431.94648615]] fig, axs = plt.subplots(nrows=1, ncols=2, figsize=(10, 5)) # 创建统一的刻度格式化器 formatter = ScalarFormatter(useMathText=True) formatter.set_powerlimits((-3, 3)) formatter.useOffset = True for i in range(2): min_max = [min(targets[i]+preds[i]), max(targets[i]+preds[i])] offset = 2 axs[i].set_ylim(min_max[0]-offset, min_max[1]+offset) axs[i].set_xlim(min_max[0]-offset, min_max[1]+offset) axs[i].set_aspect("equal") axs[i].scatter(targets[i], preds[i]) # 为当前子图的x、y轴应用格式化器 axs[i].xaxis.set_major_formatter(formatter) axs[i].yaxis.set_major_formatter(formatter) # 刷新格式化器,确保每个轴的偏移量正确计算 formatter.axis = axs[i].xaxis formatter.format_data(0) formatter.axis = axs[i].yaxis formatter.format_data(0) plt.tight_layout() plt.show()
关键细节说明
- 每个子图单独刷新格式化器是因为不同子图的数值范围不同,需要各自计算对应的偏移量
b useMathText=True会让右上角的偏移标签显示为b×10^c的标准科学计数法格式,而非纯文本形式- 如果需要调整刻度数量,可以配合
MaxNLocator使用,比如axs[i].xaxis.set_major_locator(plt.MaxNLocator(4)),放在应用格式化器之后即可保证稳定效果
内容的提问来源于stack exchange,提问作者Paddy Cahalane
相关产品推荐
相关产品推荐

