如何在实时情况下准确绘制大型数据向量的所有缩放级别?

8
我有大量数据集(10 Hz数据,每24小时有864k个点),需要实时绘制。用户可以缩放和平移以查看高度详细的散点图。
由于数据不是很连续并且存在峰值,因此由于数据集太大,我不能在每次绘制刷新时绘制每个点。
但是,如果只绘制每个第n个点,那么将会错过一些重要的特征,例如大型但短暂的峰值。
Matlab做对了。您可以提供一个包含864k个零的向量,并将任何一个点设置为1,它将正确地进行实时绘制,包括缩放和平移。
Matlab是如何做到的呢?
我的目标系统是Java,因此我将在Swing/Java2D中生成此绘图的视图。

我不太明白你在这里问什么。你能否添加一个MATLAB中如何绘制数据的代码示例? - gnovice
你的问题是关于Java还是Matlab的? - Jason S
我想知道Matlab是如何实现的,所以我会在Java中重现它。 - Pyrolistical
3个回答

5

您可以尝试从MATLAB中心下载文件:

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

来自作者的说明:

这个版本的“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);

2
我不知道Matlab是如何实现的,但我会从四叉树开始。

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

补充:使用OpenGL / JOGL进行绘图也有助于加快绘图速度。特别是如果您可以预测平移,并构建要显示在显示列表或其他内容中的点,以便您不必为新帧执行任何CPU工作。


0

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

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

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

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

为使动画平滑,请使用双缓冲。如果您的目标语言支持画布小部件,则可能支持双缓冲。

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

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


抱歉,当我说“实时”的时候,我是指绘图必须在实时中进行,但数据是静态的。 - Pyrolistical

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