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

数据不是很连续并且存在尖峰。由于数据集太大,我无法在每次绘图刷新时绘制每个点。

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

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

Matlab是如何做到的呢?

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

有帮助吗?

解决方案

您应该从MATLAB中央尝试文件:

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

发件人作者:

本的“暗算”的版本将允许您可视化具有非常大量元素的数据。绘制大型数据集使您的图形不振,但大多数时候,你并不需要所有的情节中显示的信息。您的屏幕只有这么多像素,你的眼睛会不能够检测屏幕上没有捕获任何信息。

此功能将下采样数据和绘图仅将数据的子集,从而提高了存储器需求。当情节被放大时,更多的信息被显示出来。有些工作已经完成,以确保异常被捕获。

语法:

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的是怎么做的,但我会用四叉树启动

导出您的所有数据点到四叉树,然后在指定的缩放级别来呈现,你走在四叉树(从重叠您正在查看哪些区域),直到你达到可媲美于大小区一个像素。在该区域的中间粘的像素。

补充:做用OpenGL / JOGL绘图也将帮助你获得更快的绘图。特别是如果你能预测平移,并建立该点的显示列表或东西来展示,这样你就不必做任何CPU工作的新框架。

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

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

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

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

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

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

可能有助于用 Java 实现它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top