如何实现Matplotlib中跨数量级Y轴的等间距刻度?
解决Matplotlib Y轴跨数量级刻度等间距显示问题
你的问题在于当前用的是线性Y轴,但刻度值从2μV到200mV跨越了5个数量级,线性轴下不同数量级的刻度自然会间距不均。另外你尝试的修正代码有两处错误:
np.arange(ylabel)用法错误:np.arange()需要传入起始值、终止值、步长,不能直接传数组set_set_ticklabels是拼写错误,正确写法是set_ticklabels
要实现等间距的跨数量级刻度,只需把Y轴改成对数刻度,以下是修正后的完整代码:
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas from matplotlib.figure import Figure import matplotlib.ticker as ticker import numpy as np class plottingCanvas(FigureCanvas): def __init__(self, parent=None, width=5, height=4, dpi=100): fig = Figure(figsize=(width, height), dpi=dpi) self.axes = fig.add_subplot(111) super(plottingCanvas, self).__init__(fig) fig.tight_layout() # 实例化画布(注意这里的self需要是你的Qt父组件,确保上下文正确) canvas = plottingCanvas(self, width=5, height=4, dpi=100) canvas.axes.yaxis.grid(True, linestyle='--') # 定义自定义刻度值,覆盖μV到mV范围 ylabel = np.array([0.000002, 0.00001, 0.00002, 0.0001, 0.0002, 0.001, 0.002, 0.005, 0.01, 0.05, 0.1, 0.2]) canvas.axes.set_yscale('log') # 关键:切换为对数Y轴 canvas.axes.yaxis.set_ticks(ylabel) # 使用EngFormatter自动转换为工程单位(μV、mV等) eng_formatter = ticker.EngFormatter(unit='V') canvas.axes.yaxis.set_major_formatter(eng_formatter) # 设置Y轴范围匹配刻度的最小最大值 canvas.axes.set_ylim(ymin=0.000002, ymax=0.200) canvas.draw()
关键改动说明:
canvas.axes.set_yscale('log'):将Y轴切换为对数刻度,此时不同数量级的刻度会在视觉上呈现等间距- 修正变量名冲突:原代码中
ticker既是模块名又是实例变量名,改为eng_formatter避免冲突 - 保留自定义刻度值,确保覆盖从2μV到200mV的所有需要显示的节点
这样设置后,Y轴刻度会像参考图一样呈现均匀间距,同时自动用工程单位(μV、mV)标注,无需手动处理刻度标签。
内容的提问来源于stack exchange,提问作者Pavan Kumar
相关产品推荐
相关产品推荐

