2009-02-03 20 views
7

我有大量的數據集(10赫茲的數據,因此每24小時864k點),我需要實時繪製。這個想法是用戶可以放大和平移到高度詳細的散點圖。如何在所有縮放級別實時準確地繪製大數據矢量?

數據不是非常連續的,並有尖峯。由於數據集非常大,每次繪圖刷新時都無法繪製每個點。

但是我也不能只繪製每一個第n點,否則我會錯過像大但短的尖峯的主要特徵。

Matlab做對了。你可以給它一個864k的矢量,全部爲零,只需將任意一點設置爲1,它就可以用變焦和平移實時正確繪製。

Matlab如何做到這一點?

我的目標系統是Java,因此我將在Swing/Java2D中生成此圖的視圖。

+0

我真的不明白你在這裏問什麼。您可以添加一個代碼示例,說明如何在MATLAB中繪製數據? – gnovice 2009-02-03 20:03:26

+0

您的問題是Java問題還是Matlab問題? – 2009-02-16 14:37:56

回答

4

你應該嘗試從MATLAB中央文件:

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); 
2

我不知道Matlab的是怎麼做的,但我會用Quadtrees開始。

將所有數據點轉儲到四叉樹中,然後以給定的縮放級別進行渲染,沿四叉樹走下(從與您正在查看的區域重疊的區域開始),直到達到與大小相當的區域的像素。在該區域的中間貼一個像素。

補充:使用OpenGL/JOGL進行繪圖還可以幫助您獲得更快的繪圖。特別是如果你可以預測平移,並建立要顯示在顯示列表或其他東西的點,所以你不必爲新幀做任何CPU工作。

0

10Hz的數據意味着你只需要繪製每秒10幀。這應該很容易,因爲許多遊戲以更復雜的圖形達到> 100 fps。

如果您爲每個可能的數據點每秒繪製10個像素,則可以使用600像素寬的小部件顯示一分鐘的數據。如果將第600個索引保存到最後一個樣本,應該很容易只繪製最新的數據。

如果你每10秒鐘就沒有一個新的數據點,你必須想出一個插入插值數據點的方法。想到三種選擇:

  1. 重複上一個數據點。
  2. 插入一個「空」數據點。這將導致圖表中的空白。
  3. 直到下一個數據點到達時才更新圖形。然後插入所有未一次繪製的像素,並在數據點之間進行線性插值。

爲了使動畫順利使用double-buffering。如果你的目標語言支持一個畫布部件,它可能支持雙緩衝。

縮放時,您有與上述相同的三個選項,因爲即使原始數據點是縮放的數據點也不連續。

This可能有助於在Java中實現它。

相關問題