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
相关产品推荐
相关产品推荐

