@three_pineapples 的回答描述了对 PyQtGraph 中默认下采样的一个非常好的改进,但它仍然需要动态执行下采样,这在我的情况下是有问题的。
因此,我决定实施不同的策略,即对数据进行预下采样,然后根据“缩放级别”选择已经下采样的数据或原始数据。
我将该方法与 PyQtGraph 原生采用的默认自动下采样策略相结合,以进一步提高速度(可以通过 @three_pineapples 的建议进一步改进)。
这样,PyQtGraph 总是从低维数的数据开始,这使得即使有大量样本也可以立即进行缩放和平移。
这段代码总结了我的方法,猴子修补了PlotDataItem的getData方法。
# Downsample data
downsampled_data = downsample(data, 100)
# Replacement for the default getData function
def getData(obj):
# Calculate the visible range
range = obj.viewRect()
if range is not None:
dx = float(data[-1, 0] - data[0, 0]) / (data.size[0] - 1)
x0 = (range.left() - data[0, 0]) / dx
x1 = (range.right() - data[0, 0]) / dx
# Decide whether to use downsampled or original data
if (x1 - x0) > 20000:
obj.xData = downsampled_data[:, 0]
obj.yData = downsampled_data[:, 1]
else:
obj.xData = data[:, 0]
obj.yData = data[:, 1]
# Run the original getData of PlotDataItem
return PlotDataItem.getData(obj)
# Replace the original getData with our getData
plot_data_item.getData = types.MethodType(getData, plot_data_item)