You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 09:07:45