如何在所有缩放级别实时准确地绘制大数据向量?

我有大量的数据集(10 Hz数据,每24小时864k点),我需要实时绘制。 这个想法是用户可以缩放和平移到非常详细的散点图。

数据不是很连续,而且有峰值。 由于数据集太大,每次绘图刷新时都无法绘制每个点。

但是我也不能只是绘制每一个点,否则我会错过大而短的尖峰等主要特征。

Matlab做得对。 你可以给它一个864k向量的零,只需将任意一个点设置为1,它就可以用缩放和平移实时绘制。

Matlab是如何做到的?

我的目标系统是Java,因此我将在Swing / Java2D中生成该图的视图。

您应该尝试MATLAB Central中的文件:

https://mathworks.com/matlabcentral/fileexchange/15850-dsplot-downsampled-plot

来自作者:

此版本的“plot”将允许您可视化具有大量元素的数据。 绘制大型数据集会使您的图形变得迟钝,但大多数情况下您不需要绘图中显示的所有信息。 您的屏幕只有很多像素,您的眼睛将无法检测到屏幕上未捕获的任何信息。

此function将对数据进行下采样,并仅绘制数据的子集,从而提高内存要求。 放大绘图后,将显示更多信息。 做了一些工作以确保捕获exception值。

句法:

dsplot(x, y) dsplot(y) dsplot(x, y, numpoints) 

例:

 x =linspace(0, 2*pi, 1000000); y1=sin(x)+.02*cos(200*x)+0.001*sin(2000*x)+0.0001*cos(20000*x); dsplot(x,y1); 

我不知道Matlab是如何做到的,但我从Quadtrees开始。

将所有数据点转储到四叉树中,然后以给定的缩放级别渲染,沿着四叉树(从与您正在查看的区域重叠的区域开始)向下走,直到到达与像素大小相当的区域。 将像素粘贴在该区域的中间。

补充说:使用OpenGL / JOGL绘图也可以帮助您更快地绘图。 特别是如果你可以预测平移,并建立要在显示列表中显示的点,那么你就不必为新帧做任何CPU工作。

10Hz数据意味着您只需要每秒绘制10帧。 它应该很容易,因为许多游戏的图形要复杂得多> 100 fps。

如果为每个可能的数据点绘制每秒10个像素,则可以使用600像素宽的小部件显示一分钟的数据。 如果保存第600个到最后一个样本的索引,则应该很容易只绘制最新数据。

如果每隔十分之一秒没有新的数据点,则必须想出一种插入插值数据点的方法。 我想到了三个选择:

  1. 重复上一个数据点。
  2. 插入“空”数据点。 这将导致图表中出现空白。
  3. 在下一个数据点到达之前,请勿更新图表。 然后插入所有未一次绘制的像素,并在数据点之间进行线性插值。

为了使动画流畅,请使用双缓冲 。 如果您的目标语言支持canvas小部件,它可能支持双缓冲。

缩放时,您具有与上述相同的三个选项,因为即使原始数据点,缩放的数据点也不连续。

这可能有助于在Java中实现它。