我有一个包含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
...
结果图目前看起来像这样:
6 回答
在我看来,200中的1是相当严重的数据丢失,如果那些应该用图表上的一个值表示的200个值不足以被平均值有意义地替换,那么你自己就有问题了 . 如果平均值不够好,你必须找到一个标准来告诉哪些数据更重要并且应该包括在内,我们无法帮助你,因为我们不知道它是什么类型的数据,它的统计特性,或为什么任何 Value 比另一个更重要 . 有了这些额外的信息,也许可以给出更具体的答案 .
编辑:看完图表后,似乎在给定的时间间隔内你需要最小值和最大值,因为深蓝色区域是这两者之间的值,对吗?也许您可以获取100个值并根据最小值,最大值和平均值生成图表,以便图表中的每个点都使用6而不是200个值,或类似的值 .
我不知道你的代码/数据源是什么样的,但是你可以在你的mysql select语句上做一个截然不同的事情来减少被带回你的应用程序的数据点的数量吗?
解决问题的一种方法是max-min抽取;我建议你谷歌提供一个我无法提供的定义和算法,或者我会与你分享 .
除此之外,我认为您可以使用低通(抗锯齿)滤波器,然后进行简单抽取(即丢掉多余的点) .
我认为每200个点的普通平均值就足够了 .
我知道这个问题已经很老了,但我的问题几乎相似 .
要减少要显示的点数而不影响图形的形状,我们使用Ramer-Douglas-Peucker algoritm . 未压缩图形与使用该算法的图形之间的形状差异是不明显的 .
另一种可行的方法是将图形分成200个点,并丢弃每个区间中除最大值,最小值和中值点之外的所有点 . 区间中的三个点中的每一个都绘制在其原始位置,因此极值的位置不会改变 . 使用中位数而不是均值可能对您的数据集更有效,因为最大值比最小值更极端,如果您使用均值,则会导致过滤后的图形向上移动 .