作者:sds家的 | 来源:互联网 | 2023-06-16 11:19
AssumethatIhavesomearrayofdata(avectortobespecific).CanIplotitelementbyelementse
Assume that I have some array of data (a vector to be specific). Can I plot it element by element sequentially using Gnuplot such that it seems as if it is a real life signal that is being traced through a monitor?
假设我有一些数据数组(一个特定的向量)。我是否可以使用Gnuplot按元素顺序绘制它的元素,使其看起来像是通过监视器跟踪的真实生命信号?
I know that I can write the whole data into a text file using Common Lisp, then using gnuplot I can plot it in a batch format. What I require is that I want to put a point on my plot as data comes sequentially.
我知道我可以使用Common Lisp将整个数据写入到一个文本文件中,然后使用gnuplot,我可以用批处理格式将其绘制出来。我所需要的是,当数据按顺序出现时,我想在我的图上放一个点。
Data will probably be generated inside a loop, thus you may consider x-axis as the integer valued discrete-time axis. So in the loop if the first element of the array is generated as 5, I would like to put a point on my plot to (0,5). Then if the second element is generated as 3, I would like to put another point on my plot to (1,7) (preserving the old data point). So as I iterate through the loop, I plot the data sequentially.
数据可能会在循环中生成,因此可以将x轴视为整数值离散时间轴。所以在循环中,如果数组的第一个元素生成为5,我想在我的图上加一个点(0,5)。然后,如果第二个元素生成为3,我想在我的图上再加一个点到(1,7)(保留旧的数据点)。当我在循环中迭代时,我按顺序绘制数据。
I am using emacs and Common Lisp for my purposes and I want to plot this data staying within these tools. If there are any other options other than Gnuplot, I would like to hear them.
出于我的目的,我使用emacs和Common Lisp,我想在这些工具中绘制这些数据。如果除了Gnuplot之外还有其他选择,我想听听。
If this is not easily possible, it would be cool, if I can run a Gnuplot command file by some Common Lisp command.
如果这是不容易的,那么它将是很酷的,如果我可以运行一个Gnuplot命令文件通过一些普通的Lisp命令。
edit:
编辑:
Following advices people gave under this thread, I wrote a code using cgn
which uses ltk
.
Right now I open two x11 windows at pre-specified positions on my screen and I enter the loop. In loop each time I open a stream and write the data (sine and cosine waves of 0.25 Hz sampled at 20 Hz) to the text file trial.txt with the :if-exists :append
option and close the stream. Then at each iteration I plot the whole data using the gnuplot through the format-gnuplot
command. This code gives me two windows of pre-specified x and y ranges and then one can watch the evolutions of aforementioned sine and cosine waves in the windows.
As I have stated before I don't have strong programming background (I am an electrical engineer who somehow ended using common lisp) and I am pretty sure that my code is non-optimal and unelegant. If you guys have some further advices, corrections etc. I would really like to hear them. The code is here:
根据人们在这个线程下给出的建议,我使用使用ltk编写了一个代码。现在,我在屏幕上预先指定的位置打开两个x11窗口,然后输入循环。在循环中,每次我打开一个流并将数据(在20hz采样为0.25赫兹的正弦和余弦波)写入文本文件试验。带有:if-exists:append选项的txt并关闭流。然后在每次迭代中,我使用gnuplot通过format-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)
Thank you very much.
非常感谢。
5 个解决方案