Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在不丢失图形形状的情况下减少图形数据_Php_Mysql_Algorithm_Optimization_Graph - Fatal编程技术网

Php 在不丢失图形形状的情况下减少图形数据

Php 在不丢失图形形状的情况下减少图形数据,php,mysql,algorithm,optimization,graph,Php,Mysql,Algorithm,Optimization,Graph,我有一个包含100000个数据点的数据集,我必须将其绘制在图形上。结果图的宽度约为500px,因此每个像素将有大约200个数据点,这似乎是不必要的 我需要找到一种在不丢失图形形状的情况下去除多余数据点的方法,以加快渲染速度。目前,所有100000点的渲染可能需要10秒以上的时间,因为我也在使用抗锯齿和其他“效果” 我试图通过只获取第200个数据点并绘制它们来解决这个问题,但这会导致遗漏一些更重要的点(想想我想要显示的图形中的尖峰)。我还想过将数据集分成200个数据点的块,然后从每个块中获取最大值

我有一个包含100000个数据点的数据集,我必须将其绘制在图形上。结果图的宽度约为500px,因此每个像素将有大约200个数据点,这似乎是不必要的

我需要找到一种在不丢失图形形状的情况下去除多余数据点的方法,以加快渲染速度。目前,所有100000点的渲染可能需要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
...
当前生成的图形如下所示:


我不知道您的代码/数据源是什么样子,但是否可以对mysql select语句执行一个不同的操作,以减少返回到应用程序的数据点的数量?

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

在我看来,每200个点中就有1个是非常严重的数据损失,如果这200个值在图上应该用一个值表示,但它们之间的距离不够近,无法用一个平均值进行有意义的替换,那么您自己就有问题了。如果平均值不够好,你必须找到一个标准来判断哪些数据更重要,哪些数据应该包括在内,我们不能帮助你,因为我们不知道它是什么类型的数据,它的统计特性,或者为什么任何值比其他值更重要。有了这些额外的信息,也许可以给出更具体的答案


编辑:在查看图表后,似乎需要在给定的时间间隔内同时使用最小值和最大值,因为深蓝色区域是介于这两者之间的值,对吗?也许你可以取100个值,然后从最小值、最大值和平均值绘制一个图,这样图中的每个点都是用6个值而不是200个值,或者类似的值;我建议你在谷歌上搜索一个定义和算法,我不必亲自动手,否则我会和你分享


除此之外,我认为您可以使用低通(抗锯齿)过滤器,然后进行简单的抽取(即丢弃多余的点)。

另一种可能有效的方法是将图形拆分为200个点位,并在每个间隔中丢弃除最大点、最小点和中间点以外的所有点。区间中的三个点中的每一个都在其原始位置绘制,因此极值的位置不会改变。使用中间值而不是平均值可能对数据集更有效,因为最大值比最小值极端得多,如果使用平均值,这将导致过滤后的图形向上移动

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


为了在不影响图形形状的情况下减少要显示的点数,我们使用。未压缩图形与使用此算法的图形之间的形状差异是不明显的。

您能说说为什么在每个200点的箱子中取最大值不起作用吗?如何使图形可滚动或缩放(即不同时显示所有图形)?此外,数据是否是静态的,或者或多或少是静态的,因此可能有机会在数据库中对其进行预处理?@martin clayton,因为我也想考虑“最小”峰值,使用max会破坏它们。本质上,我需要一种方法来在200个点中找到最重要的点。如果你的分辨率不能显示数据的细节,那么你的分辨率太小。我更新了我的答案以包含一些样本数据。使用DISTINCT不会起作用,因为它可能会跳过更“重要”的点。我知道您现在看到的是,对于每个宽度的像素,其中包含多少点,以及如何确定哪个像素宽度包含哪些项目?或者,由于它被指向更高的位置,您可以最大使用这200点或任何其他您想要的点(这取决于您从该图表中需要的信息)如果我有199个值为15的点和1个值为1200的点,普通平均值是不够的。我想能够显示一个明显的尖峰。是的,我也考虑过使用最小值和最大值。也许我可以通过使用两条线和中间的阴影来获得类似的结果,也许第三条线可以在顶部显示平均值。好的观点。除非有人提出了一个关于如何按照我最初打算的方式来做这件事的坚实的方程式,否则我将把这件事标记为已被接受。