我使用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轴是有序的,则将为每个块绘制一条垂直线,可能是具有不同颜色的平均值。
为了避免混叠,绘图会以2倍过采样。
如果是散点图,可以通过排序对数据进行排序,因为绘图顺序并不重要。
这个简单配方的好处是你放大得越快就越快。根据我的经验,只要数据适合内存,图表就会保持响应。例如,20个具有1000万点的时间历史数据图应该没问题。
答案 0 :(得分: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()
答案 1 :(得分:0)
抽取不是最好的,例如,如果您对稀疏数据进行抽取,它可能全部显示为零。
抽取必须是智能的,以便绘制每个LCD水平像素,其中抽取点之间的数据的最小值和最大值。然后在放大时,您会看到更多细节。
通过缩放,这在matplotlib之外无法轻松完成,因此最好在内部处理。