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

Matplotlib绘制海量数据如何下采样?嵌入PyQt5后回调不生效怎么办

问题原因
  • 核心原因:你定义的ds(DataDisplayDownsampler类实例)是MainWindow的__init__方法内的局部变量,__init__执行完成后该实例没有被其他对象持有,会被Python垃圾回收机制销毁,后续xlim_changed事件触发时,回调指向的对象已经不存在,因此不会执行对应逻辑。
  • 次要优化点:首次加载时不会自动触发下采样逻辑,会直接渲染全量441万个数据点,容易导致界面卡顿。
解决方法

只需要把ds改为MainWindow的实例属性即可,同时可以增加首次下采样调用优化初始加载性能,修改后的对应代码片段如下:

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()

        sc = MplCanvas(self, width=5, height=4, dpi=100)
        fs = 44100
        time_length = 100
        x = np.arange(fs * time_length) / fs
        y1 = np.random.randn(len(x))

        # 将ds改为实例属性,避免被垃圾回收
        self.ds = DataDisplayDownsampler(x, y1)
        self.ds.line, = sc.axe.plot(x, y1, lw=2, label='random noise')
        sc.axe.callbacks.connect('xlim_changed', self.ds.update)
        # 手动触发首次下采样,避免初始加载全量数据卡顿
        self.ds.update(sc.axe)

        toolbar = NavigationToolbar(sc, self)

        layout = QtWidgets.QVBoxLayout()
        layout.addWidget(toolbar)
        layout.addWidget(sc)

        widget = QtWidgets.QWidget()
        widget.setLayout(layout)
        self.setCentralWidget(widget)

        self.show()

修改后对X轴进行放大、缩小、平移操作时,就会自动触发下采样逻辑,控制台会打印当前使用的点数,界面不会出现卡顿问题。

内容的提问来源于stack exchange,提问作者bactone

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 16:15:04