9

我将 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万点的时间历史数据图应该没问题。

4

2 回答 2

1

似乎您只需要在绘制数据之前对其进行抽取

import numpy as np
import matplotlib.pyplot as plt

n=100000 # more then 100000 points makes it unusable slow
X=np.random.random_sample(n)
i=10*array(range(n/10))
plt.plot(X[i])
plt.show()
于 2013-12-13T02:54:12.947 回答
0

抽取不是最好的,例如,如果你抽取稀疏数据,它可能都显示为零。

抽取必须是智能的,以便每个 LCD 水平像素都绘制有抽取点之间数据的最小值和最大值。然后,当您放大时,您会看到更多更详细的信息。

通过缩放,这在 matplotlib 之外无法轻松完成,因此最好在内部处理。

于 2015-02-02T19:26:33.453 回答