从阵列进行 2-D 绘图 - 实时



我必须实时绘制传感器的扫描值。我为此目的使用 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文件。我在搜索中没有找到一个。

任何建议都会有所帮助。

据推测,您正在通过管道与 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 无论如何)

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

它是绘制标准输入的通用工具。除其他外,它能够在数据进入时制作实时数据图。如果您有不直接支持的格式的数据,请使用 awk 或 perl 之类的内容预处理您的流。