【问题标题】:gnuplot 2-D plotting from arrays - realtime来自数组的 gnuplot 2-D 绘图 - 实时
【发布时间】:2012-04-24 09:30:38
【问题描述】:

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

我想要做的是将最后 5 个扫描值以列格式存储在 .DAT 文件中,就像这样,其中 x,y 是我每次扫描的两个数组。然后使用 gnuplot 命令 " plot 'filename.dat' 1:2" "plot 'filename.dat' 2:3" etc...然后我必须在每 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 文件的情况下直接从两个数组中绘图。我没有在搜索中找到一个。

任何建议都会有所帮助。

【问题讨论】:

  • 我不完全确定我理解你的问题为什么提到二维数组。看来您有 2 个一维数组...

标签: c++ real-time gnuplot


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 非常感谢..我已经使用内联函数来绘制实时数据并且它有效。但情节变化太快,无法观察。现在我要做显示最后 5 个值的第二部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    • 1970-01-01
    相关资源
    最近更新 更多