减少图形数据而不失去图形形状

12

我有一个包含 100,000 个数据点的数据集,需要将其绘制在图形上。结果图形将大约为 500 像素宽,因此每个像素将有大约 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
...

最终生成的图表目前看起来像这样:

alt text http://www.ulmanen.fi/stuff/graph-sample.png


1
你能说一下为什么在每个200点的区间内取最大值不起作用吗?另外,可以让图形具有可滚动或可缩放的功能吗(即不要一次性显示所有内容)?此外,数据是静态的还是几乎静态的,因此可能有机会在数据库中预处理它? - martin clayton
1
@martin clayton,因为我想考虑“min”峰值,使用“max”会破坏它们。本质上,我需要一种方法来找到200个点中最重要的点。 - Tatu Ulmanen
如果您的分辨率无法显示数据的细节,那么您的分辨率就太低了。 - Svante
6个回答

14

我知道这个问题很老了,但我遇到了一个几乎相似的问题。

为了减少要显示的点的数量而不影响图形的形状,我们使用了 Ramer-Douglas-Peucker算法。使用这个算法生成的图形与未经压缩的图形之间的形状差异是无法察觉的。


9
对我来说,每200个数据中丢失1个看起来是相当严重的数据损失。如果这200个值应该用一个图表上的值来表示,但它们之间的差距不足以用平均值代替,那么你就有了一个问题。如果平均值不够好,你必须找到一个标准来确定哪些数据更重要并应该包含在内,我们无法帮助你,因为我们不知道这是什么类型的数据、它的统计属性,或者为什么任何一个值会比其他值更重要。如果提供了这些额外信息,也许可以给出更具体的答案。
编辑:在查看了图表后,似乎您需要在给定区间内同时使用最小值和最大值,因为深蓝色区域是两者之间的值,对吗?也许您可以取100个值,并从最小值、最大值和平均值创建一个图表,这样图表中的每个点就由6个值而不是200个值组成,或者类似的方法。

是的,我也考虑过同时使用最小值和最大值。也许我可以通过使用两条线并在它们之间着色来获得类似的结果,也许还可以加一条第三条线来显示平均值。很好的建议。除非有人提出一个可靠的方程来实现我最初的想法,否则我将把这个标记为已接受。 - Tatu Ulmanen

2
您的问题可以采用最大最小抽取法来解决;建议您搜索一下相关的定义和算法,我手头上没有,否则我会与您分享的。此外,我认为您可以使用低通滤波器(抗混叠)后再进行简单的抽取(即丢弃多余的点)。

2
另一种可能有效的方法是将图形分成200个点的区间,并且仅保留每个区间中的最大值、最小值和中位数。在原始位置绘制区间内的这三个点,所以极端值的位置不会改变。对于您的数据集,使用中位数而不是平均值可能效果更好,因为最大值比最小值要极端得多,如果使用平均值,则过滤后的图形会向上移动。

1

我认为每200个点的普通平均值就足够了。


或者正如之前所指出的,您可以选择这200个点中的最大值,或者任何其他您需要从此图表中获取的信息。 - user204724
1
如果我有价值为15的199个点和价值为1200的1个点,普通平均数是不够的。我想要能够展示那一个独特的峰值。 - Tatu Ulmanen

0
我不知道你的代码/数据源是什么样子的,但是在你的mysql选择语句中使用distinct是否可能减少返回到应用程序的数据点数量?

我更新了我的答案,包括一些示例数据。使用DISTINCT可能无法正常工作,因为它可能会跳过更“重要”的点。 - Tatu Ulmanen
我明白你现在看的是什么,对于每个像素宽度,其中包含多少个点,以及如何确定哪个像素宽度包含哪些项目? - mynameiscoffey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接