Gnuplot के अंदर लूप संरचना?


82

क्या किसी भी तरह से कई फ़ाइलों से डेटा पुनर्प्राप्त करने और उन्हें gnuplot में एक ही ग्राफ पर प्लॉट करने का कोई तरीका है। मान लीजिए कि मेरे पास data1.txt, data2.txt ...... data1000.txt जैसी फाइलें हैं; स्तंभों की समान संख्या वाले प्रत्येक। अब मैं कुछ लिख सकता था-

plot "data1.txt" using 1:2 title "Flow 1", \
     "data2.txt" using 1:2 title "Flow 2", \
      .
      .
      .
     "data1000.txt"  using 1:2 title "Flow 6"

लेकिन यह वास्तव में असुविधाजनक होगा। मैं सोच रहा था कि क्या gnuplot में प्लॉट भाग के माध्यम से लूप करने का कोई तरीका है ।


नीचे दिए गए जवाबbash में वास्तव में आरामदायक कार्य
Hastur

जवाबों:


96

वहाँ निश्चित है (gnuplot 4.4+ में):

plot for [i=1:1000] 'data'.i.'.txt' using 1:2 title 'Flow '.i

चर की iव्याख्या एक चर या स्ट्रिंग के रूप में की जा सकती है, इसलिए आप कुछ ऐसा कर सकते हैं

plot for [i=1:1000] 'data'.i.'.txt' using 1:($2+i) title 'Flow '.i

यदि आप एक दूसरे से ऑफसेट करना चाहते हैं।

help iterationअधिक जानकारी के लिए gnuplot कमांड लाइन पर टाइप करें ।

do forसिंटैक्स के बारे में @ DarioP के उत्तर को देखना सुनिश्चित करें ; जो आपको एक पारंपरिक forपाश के करीब कुछ देता है ।


आपके समाधान के लिए धन्यवाद "[i = 1: 1000] 'डेटा' के लिए प्लॉट। '। txt' का उपयोग कर 1: 2 '' फ़्लो '.i" ने मेरे लिए काम किया है .. मैं विंडोज़ पर C ++ के साथ gnuplot 5.2 का उपयोग कर रहा हूं .. ..
मसूदरहमान

लेकिन मुझे एक और समस्या है, मैं एक प्रोग्राम लिख रहा हूं जो हार्ड डिस्क पर कश्मीर नंबर को fream K के माध्यम से लिखता है जो कि एक ग्लोबल वैरिएबल है, इसलिए मैं अपने ग्राफ पर K की उन फाइलों की संख्या को प्लॉट करना चाहता हूं जिनका उपयोग मैंने gnuplot के लिए करने की कोशिश की थी [i ​​= 1 : K] लेकिन यह अपरिभाषित चर की त्रुटि देता है। मैं gnuplot से पाश के लिए बाहर की कोशिश की, लेकिन यह भी काम नहीं करता है।
मसूदरहमान

मैंने ग्नूप्लोट के लिए C ++ में एक फ़ंक्शन लिखा था जो [i = 1: 5] के लिए काम करता है, लेकिन जब मैं [i = 1: K] के लिए उपयोग करता हूं तो यह त्रुटि देता है ...
MasoodRehman

@MasoodUrRehman ऐसा लगता है कि आप अपनी gnllot स्क्रिप्ट में अपने C ++ कोड से एक चर का उपयोग करने की कोशिश कर रहे हैं; जब आप gnuplot को कमांड भेजते हैं, तो आप वेरिएबल K के मान को प्रिंट कर रहे हैं। Gnuplot 'अपरिभाषित चर' कह रहा है क्योंकि C ++ जानता है कि K क्या है लेकिन gnuplot नहीं करता है। यदि आप अभी भी अटके हुए हैं तो अलग सी ++ प्रश्न के रूप में अपना मुद्दा पोस्ट करना अच्छा हो सकता है।
andyras

83

do { ... }Gnuplot 4.6 के बाद से कमांड पर भी एक नज़र डालें क्योंकि यह बहुत शक्तिशाली है:

do for [t=0:50] {
  outfile = sprintf('animation/bessel%03.0f.png',t)
  set output outfile
  splot u*sin(v),u*cos(v),bessel(u,t/50.0) w pm3d ls 1
}

http://www.gnuplotting.org/gnuplot-4-6-do/


1
उदाहरण के लिए फ़ाइल नाम या रंगों की एक सरणी में एक इंडेक्स को संदर्भित करने के लिए क्या मैं पुनरावृत्ति टी का उपयोग कर सकता हूं?
tommy.carstensen 11

1
मैंने कभी कोशिश नहीं की, लेकिन मुझे इसमें कोई समस्या नहीं दिख रही है। आखिरकार दूसरी संभावना है कि सरणी के आइटम (रंग, नाम या जो भी) को सीधे वर्ग के कोष्ठक में निर्दिष्ट किया जाए, जैसा कि दिखाया गया है help do
DarioP 12

1
मैंने यहां एक नया प्रश्न पूछा stackoverflow.com/questions/18591986/loop-over-array-in-gnuplot , क्योंकि यह मेरे लिए स्पष्ट नहीं है, यह कैसे प्राप्त किया जा सकता है।
tommy.carstensen

10

मेरे पास स्क्रिप्ट है

set ...
...
list=system('ls -1B *.dat')
plot for [file in list] file w l u 1:2 t file

यहाँ दो अंतिम पंक्तियाँ शाब्दिक हैं, हेयुरिस्टिक नहीं। फिर मैं दौड़ता हूं

$ gnuplot -p all.p

*.datआपके पास जो फ़ाइल प्रकार है, उसे बदलें या फ़ाइल प्रकार जोड़ें।

अगला चरण: इस पंक्ति में ~ / .bashrc में जोड़ें

alias p='gnuplot -p ~/./all.p'

और अपनी फ़ाइल को all.pअपनी होम डायरेक्टरी और वॉइला में डाल दें । आप पी और दर्ज करके किसी भी निर्देशिका में सभी फ़ाइलों को प्लॉट कर सकते हैं।

EDIT मैंने कमांड को बदल दिया, क्योंकि यह काम नहीं करता था। पहले इसमें समाहित था list(i)=word(system(ls -1B *.dat),i)


मेरे लिए आपका कोड काम नहीं करता है। मुझे list=system(ls -1B *.dat)इसके बजाय लिखना था ।
जैक्सन

एचएम ठीक है। मैं लिनक्स पर संस्करण 4.6 पर था।
जोनाटन öström

1
इसलिए मैंने इसे फिर से आजमाया, और जैसा कि आप कहते हैं कि यह काम नहीं करता है। मुझे आपके कार्य के लिए सिस्टम कॉल के अंदर विज्ञापन एकल उद्धरण का उपयोग करना था:list=system('ls -1B *.dat')
जोनातन useström

यह मेरे लिए काम नहीं करता है। उद्धरण के साथ या बिना। क्यों?
समीरा

@ शमीरा मुझे नहीं पता।
जोनाथन öström

5

यदि आपके पास ग्राफ़ में प्लॉट करने के लिए असतत कॉलम हैं, तो निम्नलिखित का उपयोग करें

do for [indx in "2 3 7 8"] {
  column = indx + 0
  plot ifile using 1:column ;  
}

1
यहां केवल उदाहरण दिया गया है जो दिखाता है कि गैर-निरंतर संख्याओं के माध्यम से कैसे लूप किया जाए।
rectctawrats

2

मैं किसी भी निर्देशिका से काम करते हुए अक्सर कई फाइलों को अलग-अलग निर्देशिकाओं में रखने के लिए वाइल्डकार्ड का उपयोग करना चाहता था। मुझे जो समाधान मिला वह निम्नलिखित फ़ंक्शन को बनाने के लिए था~/.bashrc

plo () {
local arg="w l"
local str="set term wxt size 900,500 title 'wild plotting'
set format y '%g'
set logs
plot"
while [ $# -gt 0 ]
        do str="$str '$1' $arg,"
        shift
done
echo "$str" | gnuplot -persist
}

और इसका उपयोग करें जैसे plo *.dat ../../dir2/*.out, .datवर्तमान निर्देशिका में सभी .outफ़ाइलों और एक निर्देशिका में सभी फ़ाइलों को प्लॉट करने के लिए जो एक स्तर तक होती है और कहा जाता है dir2


आप फ़ाइलों के बिना plo() { [[ $# -eq 0 ]] && echo "Usage plo file1 file2 ..." || { .... } }कॉल करने से बचने के लिए जोड़ सकते हैं gnuplot
हस्तूर

0

यहाँ वैकल्पिक आदेश है:

gnuplot -p -e 'plot for [file in system("find . -name \\*.txt -depth 1")] file using 1:2 title file with lines'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.