如何在Matplotlib中始终将轴单位置于特定刻度标签位置?
用Matplotlib实现DIN 461风格的轴单位标注
我需要实现DIN 461标准的轴单位标注样式:单位始终放在倒数第二个轴刻度的位置。
之前试过几种方法都有问题:
- 直接用
plt.gca().set_xticklabels()修改标签,但缩放、平移图表后,标签没法同步更新正确数值,官方也不推荐这么用。 - 写了个自定义
FuncFormatter,想通过pos参数定位倒数第二个刻度,但缩放时刻度数量会变,而且pos经常是None,根本定位不准:
from matplotlib.ticker import FuncFormatter @FuncFormatter def my_formatter(x, pos): return f"{x}" if pos != 6 else 'Unit'
- 手动获取当前刻度,把倒数第二个换成单位再设置,结果轴范围变了,角落多出奇怪刻度,而且放大后刻度不再自动更新,单位直接消失:
执行代码:
xticks = ax.get_xticks() xtick_labels = list(xticks) xtick_labels[-2] = "mA" ax.set_xticks(xticks, labels=xtick_labels)
出现的问题:
- 轴范围异常,角落新增多余刻度
- 缩放图表后,刻度不更新,单位标签消失
可行解决方案
用动态获取当前刻度的自定义格式化器,每次绘制刻度时都实时拿当前的刻度列表,判断是否为倒数第二个刻度:
import matplotlib.pyplot as plt from matplotlib.ticker import FuncFormatter import numpy as np def din_unit_formatter(unit): def formatter(x, pos, ax=None): if ax is None: ax = plt.gca() # 实时获取当前轴的所有刻度位置 tick_locs = ax.get_xticks() # 只有当刻度数量≥2,且当前x值和倒数第二个刻度位置一致时,显示单位 if len(tick_locs) >= 2 and np.isclose(x, tick_locs[-2]): return unit # 其他刻度按需求格式化数值,这里保留1位小数 return f"{x:.1f}" return FuncFormatter(formatter) # 测试示例 fig, ax = plt.subplots() x = np.linspace(0, 100, 100) y = np.sin(x/10) ax.plot(x, y) # 给x轴设置格式化器,单位用mA ax.xaxis.set_major_formatter(din_unit_formatter("mA")) plt.show()
这个方案的好处:
- 不管怎么缩放、平移,都会实时获取当前刻度,准确找到倒数第二个位置放单位
- 保留Matplotlib自动调整刻度的能力,不会锁死刻度位置
- 数值格式可以灵活调整,比如把
.1f改成.2f或者其他格式
内容的提问来源于stack exchange,提问作者Alex V.
相关产品推荐
相关产品推荐

