0

我必须实时绘制传感器的扫描值。为此,我正在使用 gnuplot。到目前为止,我可以从我的 c++ 程序与 gnuplot 进行通信。我使用 .DAT 文件尝试了一些示例图,它正在工作。现在,我的要求是在单个图中绘制传感器扫描值的最后 5 个值以进行比较(这意味着我需要存储 10 个数据数组。1 个扫描有两个数组 X 和 Y)。

我要做的是将最后 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 文件的情况下直接从两个数组中绘图。我没有在搜索中找到一个。

任何的意见都将会有帮助。

4

2 回答 2

3

据推测,您正在通过管道与 gnuplot 进行通信。由于 gnuplot 是一个单独的进程,它无法访问您的程序内存空间,因此如果您不以某种方式发送数据,它就无法绘制您的数据。最直接的方法是您提到的方式(创建一个临时文件,向 gnuplot 发送命令以读取/绘制临时文件)。另一种直接的方法是使用 gnuplot 的内联数据......它的工作方式如下:

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

在这种情况下,数据文件直接写入 gnuplot 管道,不需要临时文件。help datafile special-filenames(有关更多问题,请参阅gnuplot 文档中的伪文件“-” )。

就这种方法在实时中有用——只要与重新渲染之间的时间相比,gnuplot 渲染速度快,它应该可以正常工作。(我想如果你的数组很大,也会有一些内存问题,但我怀疑这会限制任何只有 10 个一维数组的实际应用程序——如果数组那么大,你可能不应该发送整个无论如何都要gnuplot)

于 2012-04-12T12:43:46.613 回答
1

看看这个:https ://github.com/dkogan/feedgnuplot

它是绘制标准输入的通用工具。除了其他功能外,它还可以实时绘制数据。如果您有不直接支持的格式的数据,请使用 awk 或 perl 之类的东西预处理您的流。

于 2012-04-20T07:10:50.913 回答