我必须实时绘制传感器的扫描值。我正在使用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文件。我在搜索中找不到一个。
任何建议都会有所帮助。
答案 0 :(得分:2)
据推测,您正在通过管道与gnuplot进行通信。由于gnuplot是一个单独的进程,因此无法访问程序的内存空间,因此如果不以某种方式发送它,它就无法绘制数据。最直接的方式是你提到的(创建一个临时文件,向gnuplot发送一个命令来读取/绘制临时文件)。另一种直接的方法是使用gnuplot的内联数据...它的工作方式如下:
plot '-' using ... with ...
x1 y1
x2 y2
x3 y3
...
e
在这种情况下,数据文件直接写入gnuplot管道而不需要临时文件。 (有关伪文件的更多问题' - '请参阅gnuplot文档中的help datafile special-filenames
)。
只要这种方法实时有用 - 只要gnuplot渲染速度比重新渲染之间的时间快,它应该可以正常工作。 (如果您的阵列 HUGE ,我猜也会有一些内存问题,但我怀疑这会限制任何只有10个1-D阵列的实际应用程序 - 如果阵列那么大,那么你可能不管怎么说,不应该把整个东西发送给gnuplot)
答案 1 :(得分:1)
看看这个:https://github.com/dkogan/feedgnuplot
它是绘制标准输入的通用工具。除了其他方面,它还可以实现数据的实时绘制。如果您的数据格式不受直接支持,请使用awk或perl等预处理流。