2012-02-15 19 views
5

का उपयोग करके emacs से अनुक्रमिक रूप से डेटा प्लॉट करना मान लें कि मेरे पास कुछ डेटा (विशिष्ट होने वाला वेक्टर) है। क्या मैं अनुक्रमिक रूप से जीनप्लॉट का उपयोग कर तत्व द्वारा तत्व को प्लॉट कर सकता हूं जैसे ऐसा लगता है कि यह वास्तविक जीवन संकेत है जिसे मॉनीटर के माध्यम से देखा जा रहा है?सामान्य लिस्प और ग्नुपलॉट

मुझे पता है कि मैं सामान्य लिस्प का उपयोग करके एक संपूर्ण फ़ाइल को टेक्स्ट फ़ाइल में लिख सकता हूं, फिर gnuplot का उपयोग करके मैं इसे बैच प्रारूप में प्लॉट कर सकता हूं। मुझे जो चाहिए वह यह है कि मैं अपनी साजिश पर एक बिंदु डालना चाहता हूं क्योंकि डेटा अनुक्रमिक रूप से आता है।

डेटा लूप के अंदर शायद उत्पन्न किया जाएगा, इस प्रकार आप एक्स-अक्ष को पूर्णांक मूल्यवान पृथक-समय अक्ष के रूप में मान सकते हैं। तो लूप में यदि सरणी का पहला तत्व 5 के रूप में उत्पन्न होता है, तो मैं अपनी साजिश पर एक बिंदु (0,5) डालना चाहता हूं। फिर यदि दूसरा तत्व 3 के रूप में उत्पन्न होता है, तो मैं अपनी साजिश पर एक और बिंदु (1,7) (पुराने डेटा बिंदु को संरक्षित करना) रखना चाहता हूं। इसलिए जब मैं लूप के माध्यम से पुन: प्रयास करता हूं, तो मैं अनुक्रमिक रूप से डेटा प्लॉट करता हूं।

मैं अपने उद्देश्यों के लिए एमएक्स और कॉमन लिस्प का उपयोग कर रहा हूं और मैं इन उपकरणों के भीतर रहने वाले इस डेटा को प्लॉट करना चाहता हूं। अगर ग्नुपॉट के अलावा कोई अन्य विकल्प है, तो मैं उन्हें सुनना चाहता हूं।

यदि यह आसानी से संभव नहीं है, तो यह अच्छा होगा, अगर मैं कुछ सामान्य Lisp कमांड द्वारा एक Gnuplot कमांड फ़ाइल चला सकता हूं।

संपादित करें:

के बाद सलाह लोग इस सूत्र के तहत दिया था, मैं cgn जो ltk का उपयोग करता है का उपयोग कर एक कोड लिखा था।
अभी मैं अपनी स्क्रीन पर पूर्व-निर्दिष्ट स्थितियों पर दो x11 विंडो खोलता हूं और मैं लूप दर्ज करता हूं। लूप में प्रत्येक बार जब मैं एक स्ट्रीम खोलता हूं और :if-exists :append विकल्प के साथ टेक्स्ट फ़ाइल trial.txt पर डेटा (20 हर्ट्ज पर नमूना 0.25 हर्ट्ज की साइन और कोसाइन तरंगें) लिखता है और स्ट्रीम बंद करता है। फिर प्रत्येक पुनरावृत्ति पर मैं format-gnuplot कमांड के माध्यम से gnuplot का उपयोग कर पूरा डेटा प्लॉट करता हूं। यह कोड मुझे पूर्व-निर्दिष्ट एक्स और वाई श्रेणियों की दो खिड़कियां देता है और फिर कोई खिड़कियों में उपरोक्त साइन और कोसाइन तरंगों के विकास को देख सकता है।
जैसा कि मैंने पहले कहा है कि मेरे पास मजबूत प्रोग्रामिंग पृष्ठभूमि नहीं है (मैं एक विद्युत अभियंता हूं जो किसी भी तरह से सामान्य लिस्प का उपयोग समाप्त कर देता है) और मुझे पूरा यकीन है कि मेरा कोड गैर-इष्टतम और अनूठा है। अगर आपके पास कुछ और सलाहएं हैं, सुधार आदि। मैं वास्तव में उन्हें सुनना चाहूंगा। कोड यहां है:

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

बहुत बहुत धन्यवाद।

+0

तो तुम एक खाली खिड़की चाहते हैं के साथ इंटरफ़ेस के लिए एक काम कर कॉमन लिस्प समाधान है, और फिर, बिंदु के बाद बिंदु अपने सभी डेटा प्रदर्शित करने के बीच देरी से प्रदर्शित किया जाता बिंदु एन और बिंदु एन + 1, एक सेकंड कहो, क्या मैं आपके प्रश्न को सही समझ रहा हूं? –

+0

बिल्कुल, 1 सेकंड या मेरे डेटा टीएस सेकेंड की नमूना दर के आधार पर। – YBE

+0

जब तक मुझे गलती नहीं होती है, यह इमाक्स के साथ मुश्किल से कुछ नहीं है, है ना? वैकल्पिक समाधान के लिए, आप इस पर विचार कर सकते हैं, जैसा कि [सीवी थ्रेड] (http://stats.stackexchange.com/q/6021/930) पर दिखाया गया है। अगर मैं सीएल/gnuplot में एक उचित समाधान के बारे में सोच सकता हूं, तो मैं इसे पोस्ट करूंगा। उत्तर के लिए – chl

उत्तर

3

cgn gnuplot, का उपयोग करता है जो LTK

+0

प्रश्न में पूछे जाने पर गतिशील रूप से काम करेगा? आपका अग्रिम रूप से बोहोत धन्यवाद। – YBE

+0

हां, निश्चित रूप से। आपको बस 'start-gnuplot'' की आवश्यकता है, और फिर आप अलग-अलग 'cgn' फ़ंक्शन –

+0

पर इंटरैक्टिव रूप से मूल्यांकन कर सकते हैं मैंने कल साजिश के लिए cgn का उपयोग किया है। यह काम करता हैं। हालांकि मुझे यकीन नहीं है, मैं gnuplot में MATLAB के ड्रॉव फ़ंक्शन के बराबर तरीके से डेटा को गतिशील रूप से साजिश करने का लक्ष्य कैसे प्राप्त कर सकता हूं। क्या तुम्हारे पास कोई विचार है? अग्रिम में धन्यवाद। – YBE

1

मुझे ग्नुपॉट के साथ अनुभव नहीं हुआ है, और एक त्वरित खोज ने बहुत अधिक जानकारी नहीं दी है। लेकिन शायद मैं एक दृष्टिकोण का प्रस्ताव कर सकते हैं। मान लें कि आप अपने इनपुट को खंडित करते हैं, उदाहरण के लिए '(1 2 3 4 5)' ((1) (1 2) (1 2 3) (1 2 3 4) (1 2 3 4 5)), तो आप तब कर सकते हैं प्रत्येक के लिए एक साजिश उत्पन्न करें, और समय-समय पर खिड़की में प्रदर्शित करने के लिए lispbuilder-sdl जैसे ग्राफिक्स लाइब्रेरी का उपयोग करें। एसडीएल में टाइमर होता है और यह छवियों को ठीक दिखा सकता है।

+0

उत्तर के लिए धन्यवाद। आपकी विधि व्यावहारिक प्रतीत होती है, हालांकि अगर यह अधिक प्रत्यक्ष तरीका है तो यह मेरे लिए वास्तव में बेहतर होगा। – YBE

2

आप प्लूटिंग कमांड के साथ gnuplot पर प्रक्रिया बना सकते हैं और डेटा को इसके stdin पर भेज सकते हैं। मैं कैसे कॉमन लिस्प में इस तरह की प्रक्रिया का प्रबंधन करने के यकीन नहीं है, लेकिन आप निश्चित रूप से 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") 

संबंधित मुद्दे