2012-04-12 88 views
0

我必須做傳感器的掃描值的實時繪圖。我正在使用gnuplot來達到這個目的。到目前爲止,我可以通過我的C++程序與gnuplot進行通信。我嘗試了一些使用.DAT文件的示例圖,它正在工作。現在,我的要求是繪製傳感器掃描值的最後5個值作爲比較(這意味着我需要存儲10個數據陣列,1次掃描有兩個數組X和Y)。gnuplot從陣列2-D繪圖 - 實時

我想要做的是將最後5個掃描值以列格式存儲在.DAT文件中,像這樣,其中x,y是我的兩個數組,每次掃描。然後使用gnuplot命令「plot 'filename.dat'1:2「」plot'filename.dat'2:3「等。。然後,我必須在每掃描5次後重寫文件。

X1 Y1 X2 Y2 X3 Y3 X4 Y4 X5 Y5 
2.3 3.4 6.6 3.6 5.5 6.5 8.5 5.5 4.5 6.6 
4.3 4.5 6.2 7.7 4.3 9.2 1.4 6.9 2.4 7.8 

我想在繼續之前確認它是否對實時處理有效。還有沒有任何命令gnuplot直接繪製兩個數組沒有使用.dat文件。我在搜索中找不到一個。

任何建議將有所幫助。

+0

我不完全確定我明白你爲什麼會提到二維數組。看起來你有2個1D陣列... – mgilson 2012-04-12 12:45:35

回答

2

大概,你正在通過管道與gnuplot進行通信。由於gnuplot是一個單獨的進程,因此它無法訪問程序的內存空間,因此無法以某種方式發送數據而無法繪製數據。最直接的方法是你如何提到(創建一個臨時文件,發送命令到gnuplot讀取/繪製臨時文件)。另一種直接的方法是使用的gnuplot的內聯數據......它的工作原理是:

plot '-' using ... with ... 
    x1 y1 
    x2 y2 
    x3 y3 
    ... 
    e 

在這種情況下,數據文件被直接寫入gnuplot的管,無需臨時文件。 (關於更多問題,關於僞文件' - ',請參閱gnuplot文檔中的help datafile special-filenames)。

只要這種方法實時有用 - 只要gnuplot的渲染速度與重新渲染之間的時間相比較快,它應該可以正常工作。 (我想如果你的陣列是巨大的也有一些內存問題,但我懷疑這會限制任何真正的應用程序只有10個1-D數組 - 如果數組很大,你可能不應該發送整個事情反正GNUPLOT)

+0

非常感謝..我已經使用內聯函數繪製實時數據,它的工作原理。但情節變化太快,無法觀察。現在我要做顯示最後5個值的第二部分。 – ShivShambo 2012-04-13 01:37:55

1

在此請看:https://github.com/dkogan/feedgnuplot

這是一個通用的工具來繪製標準輸入。除此之外,它還能夠實時製作數據圖。如果數據的格式不直接支持,請使用awk或perl等方法對數據流進行預處理。