8

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

数据不是很连续,有尖峰。由于数据集如此之大,我无法在每次绘图刷新时绘制每个点。

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

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

Matlab是如何做到的?

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

4

3 回答 3

5

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

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

来自作者:

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

此函数将对数据进行下采样并仅绘制数据的子集,从而提高内存需求。放大绘图时,会显示更多信息。已完成一些工作以确保捕获异常值。

句法:

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);
于 2009-02-03T20:02:39.123 回答
2

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

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

补充:使用 OpenGL/JOGL 进行绘图也将帮助您获得更快的绘图速度。特别是如果您可以预测平移,并建立要在显示列表或其他内容中显示的点,这样您就不必为新帧做任何 CPU 工作。

于 2009-02-03T20:05:15.997 回答
0

10Hz 数据意味着您只需每秒绘制 10 帧。这应该很容易,因为许多游戏可以实现超过 100 fps 的图形,而且图形要复杂得多。

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

如果您没有每 10 秒的新数据点,您必须想出一种插入插值数据点的方法。想到三个选择:

  1. 重复最后一个数据点。
  2. 插入一个“空”数据点。这将导致图表中的空白。
  3. 在下一个数据点到达之前不要更新图表。然后插入您没有立即绘制的所有像素,并在数据点之间进行线性插值。

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

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

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

于 2009-02-03T20:18:02.430 回答