我将 matplotlib 用于信号处理应用程序,我注意到它在大型数据集上阻塞。这是我真正需要改进以使其成为可用应用程序的地方。
我正在寻找的是一种让 matplotlib 抽取我的数据的方法。是否有设置、属性或其他简单的方法来启用它?欢迎提出任何关于如何实现这一点的建议。
一些代码:
import numpy as np
import matplotlib.pyplot as plt
n=100000 # more then 100000 points makes it unusable slow
plt.plot(np.random.random_sample(n))
plt.show()
一些背景资料
我曾经在一个大型 C++ 应用程序上工作,我们需要绘制大型数据集,为了解决这个问题,我们曾经利用数据结构如下:
在大多数情况下,如果我们想要一个折线图,那么数据是有序的,通常甚至是等距的。如果是等距的,那么你可以直接从缩放矩形和逆轴变换计算数据数组中的开始和结束索引。如果它是有序的但不是等距的,则可以使用二进制搜索。
接下来,缩放切片被抽取,并且由于数据是有序的,我们可以简单地迭代落在一个像素内的点块。并且对于每个块计算平均值、最大值和最小值。然后我们在图中绘制一个条形,而不是一个像素。
例如:如果 x 轴是有序的,则会为每个块绘制一条垂直线,可能是具有不同颜色的平均值。
为避免混叠,该图以两倍的因子进行过采样。
如果是散点图,数据可以通过排序进行排序,因为绘制的顺序并不重要。
这个简单食谱的好处是,你放大得越多,它变得越快。根据我的经验,只要数据适合内存,图表就会保持非常灵敏。比如20个1000万点的时间历史数据图应该没问题。