我有一个包含10万个数据点的数据集,我必须在图表上绘制。结果图的宽度约为500px,因此对于每个像素,将有大约200个数据点,这似乎是非常不必要的。
我需要找到一种方法来摆脱多余的数据点而不会丢失图形的形状来加速渲染。目前所有100 000点的渲染可能需要10秒以上,因为我还使用了抗锯齿和其他“效果”。
我尝试通过仅采用每个第200个数据点并绘制它们来解决这个问题,但这会导致一些更重要的点丢失(想想我希望能够显示的图中的峰值)。我还想过将数据集拆分为200个数据点的块,然后从每个块中获取最大值,但这也无法正常工作。
有人知道一种方法可以满足我的需求吗?我使用的语言是PHP,图形由GD创建,数据来自MySQL,因此欢迎对其中一些进行优化。
数据采用以下格式:
Datetime Value
2005-01-30 00:00:00 35.30
2005-01-30 01:00:00 35.65
2005-01-30 02:00:00 36.15
2005-01-30 03:00:00 35.95
...
结果图目前看起来像这样:
答案 0 :(得分:14)
我知道这个问题很老但我的问题几乎相似。
要减少要显示的点数而不影响图形的形状,我们使用Ramer-Douglas-Peucker algoritm。未压缩图形与使用此算法的图形之间的形状差异是不明显的。
答案 1 :(得分:9)
在我看来,200中有1是非常严重的数据丢失,如果那些应该用图表上的一个值表示的200个值不足以被平均值有意义地替换,那么你自己就有问题了。如果平均值不够好,你必须找到一个标准来告诉哪些数据更重要并且应该包括在内,我们无法帮助你,因为我们不知道它是什么类型的数据,它的统计特性,或为什么任何价值比另一个更重要。有了这些额外的信息,也许可以给出一个更具体的答案。
编辑:看完图表后,似乎在给定的时间间隔内你需要最小值和最大值,因为深蓝色区域是这两者之间的值,对吗?也许您可以从最小值,最大值和平均值中获取100个值并生成图表,以便图表中的每个点都使用6而不是200个值,或类似的值。
答案 2 :(得分:2)
解决问题的一种方法是max-min抽取;我建议谷歌提供一个我无法提供的定义和算法,或者我会与你分享。
除此之外,我认为您可以使用低通(抗锯齿)滤波器,然后进行简单抽取(即丢掉多余的点)。
答案 3 :(得分:2)
可能有效的另一种方法是将图形分成200个点,并丢弃每个区间中除最大值,最小值和中值点之外的所有点。区间中的三个点中的每一个都绘制在其原始位置,因此极值的位置不会改变。使用中位数而不是均值可能会更好地适用于您的数据集,因为最大值比最小值更极端,如果您使用均值,则会导致过滤后的图形向上移动。
答案 4 :(得分:1)
我认为每200个点的普通平均值就足够了。
答案 5 :(得分:0)
我不知道你的代码/数据源是什么样的,但是你可以在你的mysql select语句上做一个截然不同的事情来减少返回你的应用程序的数据点的数量吗?