Последовательное построение данных из emacs с использованием Common Lisp и Gnuplot

Предположим, у меня есть некоторый массив данных (точнее, вектор). Могу ли я построить его поэлементно, последовательно используя Gnuplot, чтобы казалось, что это реальный сигнал, отслеживаемый через монитор?

Я знаю, что могу записать все данные в текстовый файл с помощью Common Lisp, затем с помощью gnuplot я могу построить его в пакетном формате. Что мне нужно, так это то, что я хочу поставить точку на моем графике, поскольку данные поступают последовательно.

Данные, вероятно, будут генерироваться внутри цикла, поэтому вы можете рассматривать ось x как целочисленную ось дискретного времени. Итак, в цикле, если первый элемент массива сгенерирован как 5, я хотел бы поставить точку на моем графике на (0,5). Затем, если второй элемент сгенерирован как 3, я хотел бы поставить еще одну точку на моем графике на (1,7) (с сохранением старой точки данных). Поэтому, просматривая цикл, я последовательно рисую данные.

Я использую emacs и Common Lisp для своих целей, и я хочу отобразить эти данные, оставаясь в этих инструментах. Если есть другие варианты, кроме Gnuplot, я бы хотел их услышать.

Если это нелегко, было бы здорово, если бы я мог запустить командный файл Gnuplot с помощью какой-нибудь команды Common Lisp.

править:

Следуя советам, которые люди давали в этой теме, я написал код, используя cgn , который использует ltk .
Прямо сейчас я открываю два окна x11 в заранее определенных положениях на моем экране и вхожу в цикл. В цикле каждый раз, когда я открываю поток и записываю данные (синусоидальные и косинусоидальные волны 0,25 Гц с частотой дискретизации 20 Гц) в текстовый файл trial.txt с параметром : if-exists: append и закрываю ручей. Затем на каждой итерации я рисую все данные, используя gnuplot с помощью команды format-gnuplot . Этот код дает мне два окна с заранее заданными диапазонами x и y, а затем можно наблюдать эволюцию вышеупомянутых синусоидальных и косинусоидальных волн в окнах.
Как я уже говорил ранее, у меня нет сильного опыта программирования (я инженер-электрик, который каким-то образом перестал использовать обычный лисп), и я почти уверен, что мой код неоптимален и неэлегантен. Если у вас есть дополнительные советы, исправления и т. Д., Я бы очень хотел их услышать. Код здесь:

(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)

Большое спасибо.

5
задан YBE 19 February 2012 в 00:22
поделиться