如何在Matplotlib中将轴单位移至轴标签并保留自动缩放功能?
解决方案
可以通过以下步骤实现需求,既保留自动单位缩放能力,又无需手动计算幂次和前缀:
- 先使用
EngFormatter让Matplotlib自动处理数据缩放,确定合适的单位前缀 - 获取Formatter自动选择的缩放因子,匹配对应的工程前缀符号
- 更新轴标签,将前缀和单位整合到标签文本中
- 重新设置Formatter,让刻度仅显示纯数值,不附带单位
完整代码示例
import numpy as np import matplotlib.pyplot as plt from matplotlib.ticker import EngFormatter # 模拟电流数据(范围-30mA到30mA) x = np.linspace(-30e-3, 30e-3, 100) y = np.linspace(0, 10, 100) fig, ax = plt.subplots(figsize=(15,12)) ax.plot(x, y) # 第一步:设置带单位的Formatter,让系统自动计算缩放 x_formatter = EngFormatter('A') ax.xaxis.set_major_formatter(x_formatter) y_formatter = EngFormatter('V') ax.yaxis.set_major_formatter(y_formatter) # 第二步:定义工程前缀与缩放因子的对应关系 prefix_map = { 1e-12: 'p', 1e-9: 'n', 1e-6: 'µ', 1e-3: 'm', 1: '', 1e3: 'k', 1e6: 'M', 1e9: 'G', 1e12: 'T' } # 处理X轴:获取自动选择的前缀,更新标签并修改Formatter x_prefix = prefix_map.get(x_formatter.scale, '') ax.set_xlabel(f'Current ({x_prefix}A)') ax.xaxis.set_major_formatter(EngFormatter('A', unit='')) # 处理Y轴(同理操作) y_prefix = prefix_map.get(y_formatter.scale, '') ax.set_ylabel(f'Voltage ({y_prefix}V)') ax.yaxis.set_major_formatter(EngFormatter('V', unit='')) plt.show()
关键说明
- 先设置带单位的
EngFormatter是为了让Matplotlib根据数据范围自动选择最优的缩放因子(比如对-30mA到30mA的电流,会自动选择1e-3的缩放,对应'm'前缀) - 通过
x_formatter.scale可以直接获取系统自动计算的缩放因子,无需手动计算幂次 - 重新设置
EngFormatter时传入unit='',就能让刻度仅显示纯数字,把单位和前缀移到轴标签中
内容的提问来源于stack exchange,提问作者roboguy222
相关产品推荐
相关产品推荐

