2012-02-15 40 views
5

Giả sử rằng tôi có một số mảng dữ liệu (một véc-tơ cụ thể). Tôi có thể vẽ nó thành phần tử theo phần tử tuần tự bằng cách sử dụng Gnuplot sao cho có vẻ như đó là một tín hiệu thực tế đang được truy tìm thông qua một màn hình?Vẽ dữ liệu tuần tự từ các emacs bằng Common Lisp và Gnuplot

Tôi biết rằng tôi có thể ghi toàn bộ dữ liệu vào một tệp văn bản bằng cách sử dụng Common Lisp, sau đó sử dụng gnuplot tôi có thể vẽ nó theo định dạng lô. Những gì tôi yêu cầu là tôi muốn đặt một điểm trên cốt truyện của tôi khi dữ liệu xuất hiện tuần tự.

Dữ liệu có thể sẽ được tạo bên trong một vòng lặp, do đó bạn có thể xem trục x là trục có giá trị số nguyên rời rạc. Vì vậy, trong vòng lặp nếu phần tử đầu tiên của mảng được tạo ra là 5, tôi muốn đặt một điểm trên cốt truyện của tôi lên (0,5). Sau đó, nếu phần tử thứ hai được tạo ra là 3, tôi muốn đặt một điểm khác trên cốt truyện của tôi lên (1,7) (bảo toàn điểm dữ liệu cũ). Vì vậy, khi tôi lặp qua vòng lặp, tôi vẽ dữ liệu tuần tự.

Tôi đang sử dụng emacs và Common Lisp cho mục đích của mình và tôi muốn vẽ dữ liệu này nằm trong các công cụ này. Nếu có bất kỳ lựa chọn nào khác ngoài Gnuplot, tôi muốn nghe chúng.

Nếu điều này là không dễ dàng có thể, nó sẽ được mát mẻ, nếu tôi có thể chạy một lệnh lệnh Gnuplot bởi một số lệnh Common Lisp.

chỉnh sửa:

Tiếp theo lời khuyên mọi người đã thuộc chủ đề này, tôi đã viết một mã sử dụng cgn trong đó sử dụng ltk.
Ngay bây giờ tôi mở hai cửa sổ x11 ở vị trí được chỉ định trước trên màn hình của tôi và tôi nhập vòng lặp. Trong vòng lặp mỗi khi tôi mở một dòng và ghi dữ liệu (sóng sin và sin của 0,25 Hz lấy mẫu ở 20 Hz) vào tệp văn bản trial.txt với tùy chọn :if-exists :append và đóng luồng. Sau đó, tại mỗi lần lặp, tôi vẽ toàn bộ dữ liệu bằng cách sử dụng gnuplot thông qua lệnh format-gnuplot. Mã này cung cấp cho tôi hai cửa sổ của phạm vi x và y được chỉ định trước và sau đó người ta có thể xem các diễn biến của sóng sin và sin cô gái nói trên trong cửa sổ.
Như tôi đã nói trước khi tôi không có nền tảng lập trình mạnh mẽ (tôi là một kỹ sư điện bằng cách nào đó đã kết thúc bằng cách sử dụng thông thường) và tôi khá chắc chắn rằng mã của tôi không tối ưu và không thỏa hiệp. Nếu các bạn có thêm một số lời khuyên, chỉnh sửa, vv tôi thực sự muốn nghe chúng. Mã này ở đâ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) 

Cảm ơn bạn rất nhiều.

+0

Vì vậy, bạn muốn một cửa sổ trống rỗng, và sau đó, điểm sau thời điểm tất cả các dữ liệu của bạn được hiển thị với một sự chậm trễ giữa hiển thị điểm n và điểm n + 1, nói một giây, tôi có hiểu câu hỏi của bạn đúng không? –

+0

chính xác, 1 giây hoặc tùy thuộc vào tốc độ lấy mẫu dữ liệu của tôi Ts giây. – YBE

+0

Trừ khi tôi nhầm là điều này hầu như không có gì với Emacs, đúng không? Đối với giải pháp thay thế, bạn có thể xem xét R, như được minh họa trên [CV thread] này (http://stats.stackexchange.com/q/6021/930). Nếu tôi có thể nghĩ ra một giải pháp thích hợp trong CL/gnuplot, tôi sẽ đăng nó. – chl

Trả lời

3

cgn là một giải pháp Common Lisp làm việc cho interfacing với gnuplot, trong đó sử dụng LTK

+0

cgn sẽ hoạt động như tôi đã hỏi trong câu hỏi? Cảm ơn rất nhiều trước. – YBE

+0

Vâng, chắc chắn rồi. Bạn chỉ cần 'start-gnuplot', và sau đó bạn có thể đánh giá tương tác các hàm' cgn' khác nhau –

+0

Tôi đã sử dụng cgn cho âm mưu ngày hôm qua. Nó hoạt động. Tuy nhiên tôi không chắc chắn, làm thế nào tôi có thể đạt được mục tiêu vẽ sơ đồ dữ liệu một cách tương đương với hàm rút gọn của MATLAB trong gnuplot. Bạn còn ý kiến ​​nào không? Cảm ơn trước. – YBE

1

Tôi không có kinh nghiệm với Gnuplot và tìm kiếm nhanh không bật quá nhiều thông tin. Nhưng có lẽ tôi có thể đề xuất một cách tiếp cận. Giả sử bạn chẻ đầu vào của mình, ví dụ '(1 2 3 4 5) sẽ là' ((1) (1 2) (1 2 3) (1 2 3 4) (1 2 3 4 5)), sau đó bạn có thể tạo ra một âm mưu cho mỗi, và sử dụng một thư viện đồ họa như lispbuilder-sdl để hiển thị nó trong một cửa sổ với một sự chậm trễ thời gian. SDL có một bộ đếm thời gian và nó có thể hiển thị hình ảnh tốt.

+0

Cảm ơn bạn đã trả lời. Phương pháp của bạn dường như có thể thực hiện được, mặc dù nó sẽ thực sự tốt hơn cho tôi nếu có cách trực tiếp hơn. – YBE

2

Bạn có thể tạo quy trình để gnuplot và gửi dữ liệu đến stdin cùng với vẽ các lệnh. Tôi không chắc chắn làm thế nào để quản lý quá trình như vậy trong Common Lisp nhưng bạn chắc chắn có thể làm điều này trong Emacs:

(setf *gnuplot-proc* (start-process "gnuplot" "*gnuplot-proc*" "gnuplot")) 
;;; initiate plotting of data from stdin 
(process-send-string *gnuplot-proc* 
        "plot \"-\" with lines\n") 
;; send your data 
(process-send-string *gnuplot-proc* 
        "5 -1\n4 -3.5\n3 9.5\n") 
;; end of data, after this gnuplot would pop up interactive window 
(process-send-string *gnuplot-proc* "e\n") 

Với quá trình không đồng bộ như vậy thật dễ dàng để viết một cái gì đó để làm cho nó tương tác cập nhật cốt truyện như dữ liệu mới đến cùng.

Các vấn đề liên quan