2012-04-12 90 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等方法对数据流进行预处理。