假设我有一些数据数组(具体来说是向量)。能否使用Gnuplot逐个元素地绘制它,使其看起来像是通过监视器跟踪的实时信号?
我知道我可以使用Common Lisp将整个数据写入文本文件,然后使用gnuplot以批处理格式绘制它。我需要的是,当数据按顺序到来时,我想在我的绘图上放置一个点。
数据可能是在循环内生成的,因此您可以将x轴视为整数值离散时间轴。因此,在循环中,如果数组的第一个元素生成为5,则我想将一个点放在我的图上(0,5)。然后,如果第二个元素生成为3,则我想再在我的图上放置另一个点(1,7)(保留旧数据点)。因此,随着循环迭代,我逐步绘制数据。
我正在使用emacs和Common Lisp,并希望在这些工具中绘制此数据。如果除Gnuplot之外还有其他选项,我想听听它们。
如果不容易实现,如果我可以通过某个Common Lisp命令运行Gnuplot命令文件,那就太好了。
编辑:
根据人们在此主题下给出的建议,我编写了一个使用cgn(使用ltk)的代码。
现在我在屏幕上预先指定的两个位置打开了两个x11窗口,并进入循环。在循环中,每次我都会打开流并使用:if-exists:append选项将数据(0.25 Hz采样的正弦和余弦波)写入文本文件trial.txt,然后关闭流。然后在每次迭代时,我使用format-gnuplot命令绘制整个数据的gnuplot。这个代码给我两个预先指定的x和y范围的窗口,然后可以在窗口中观察上述正弦和余弦波的演变。
正如我之前所述,我没有坚实的编程背景(我是一名电气工程师,不知何故使用了common lisp),我相当确定我的代码不是最优的且不够优雅。如果您们有其他建议、修正等,我真的想听听。这里是代码:
非常感谢你。
我知道我可以使用Common Lisp将整个数据写入文本文件,然后使用gnuplot以批处理格式绘制它。我需要的是,当数据按顺序到来时,我想在我的绘图上放置一个点。
数据可能是在循环内生成的,因此您可以将x轴视为整数值离散时间轴。因此,在循环中,如果数组的第一个元素生成为5,则我想将一个点放在我的图上(0,5)。然后,如果第二个元素生成为3,则我想再在我的图上放置另一个点(1,7)(保留旧数据点)。因此,随着循环迭代,我逐步绘制数据。
我正在使用emacs和Common Lisp,并希望在这些工具中绘制此数据。如果除Gnuplot之外还有其他选项,我想听听它们。
如果不容易实现,如果我可以通过某个Common Lisp命令运行Gnuplot命令文件,那就太好了。
编辑:
根据人们在此主题下给出的建议,我编写了一个使用cgn(使用ltk)的代码。
现在我在屏幕上预先指定的两个位置打开了两个x11窗口,并进入循环。在循环中,每次我都会打开流并使用:if-exists:append选项将数据(0.25 Hz采样的正弦和余弦波)写入文本文件trial.txt,然后关闭流。然后在每次迭代时,我使用format-gnuplot命令绘制整个数据的gnuplot。这个代码给我两个预先指定的x和y范围的窗口,然后可以在窗口中观察上述正弦和余弦波的演变。
正如我之前所述,我没有坚实的编程背景(我是一名电气工程师,不知何故使用了common lisp),我相当确定我的代码不是最优的且不够优雅。如果您们有其他建议、修正等,我真的想听听。这里是代码:
(setf filename "trial.txt")
(setf path (make-pathname :name filename))
(setf str (open path :direction :output :if-exists :supersede :if-does-not-exist :create))
(format str "~,4F ~,4F" -1 -1)
(close str)
;start gnuplot process
(start-gnuplot "/Applications/Gnuplot.app/Contents/Resources/bin/gnuplot")
;set 2 x11 windows with the following properties
(format-gnuplot "cd ~S" "Users/yberol/Desktop/lispbox/code")
(format-gnuplot "set terminal x11 0 position 0,0")
(format-gnuplot "set xrange [0:10]")
(format-gnuplot "set yrange [-1:1]")
(format-gnuplot "unset key")
(format-gnuplot "set grid")
(format-gnuplot "plot ~S using 1" filename)
(format-gnuplot "set terminal x11 1 position 800,0")
(format-gnuplot "plot ~S using 2" filename)
;write data into text
(loop :for i :from 0 :to 10 :by (/ 1 20) :do
(setf str (open path :direction :output :if-exists :append :if-does-not-exist :create))
(format str "~,4F ~,4F ~,4F ~%" i (sin (* 2 pi (/ 5 20) i)) (cos (* 2 pi (/ 5 20) i)))
(close str)
(format-gnuplot "set terminal x11 0")
(format-gnuplot "plot ~S using 1:2 with lines" filename)
(format-gnuplot "set terminal x11 1")
(format-gnuplot "plot ~S using 1:3 with lines" filename)
(sleep 0.1))
(close-gnuplot)
非常感谢你。
cgn
,但是除非您想切换到类似xlispstat或Arc(不是Paul Graham的Arc),否则我不知道CL是否具有动态绘图功能;这两个都基于CLISP的子集。 - chl