2012-12-20 23 views
10

मैं एक फ़ाइल से डेटा प्लॉट कर रहा हूं। डेटा अंक मीट्रिक इकाइयों में हैं। मैं दाएं (वाई 2) पर एक दूसरा स्केल दिखाना चाहता हूं जो मानक इकाइयों में है।ग्नुपलॉट: विभिन्न इकाइयों के लिए वाई 2 अक्ष स्केल कैसे जोड़ें

फ़ाइल समय के साथ रॉकेट मोटर जोर का प्रतिनिधित्व करती है। डेटा न्यूटन में हैं। मैं बाईं ओर न्यूटन दिखाना चाहता हूं (यह स्वयं ही होता है, स्वाभाविक रूप से) और दाईं ओर पाउंड बल। रूपांतरण एक साधारण कारक है (एलबीएफ प्राप्त करने के लिए 0.2248 द्वारा एन गुणा करें)।

मैं y2tics सेट कर सकता हूं और यदि मैं मैन्युअल रूप से y2range सेट करता हूं, तो वे दाईं ओर दिखाई देते हैं। मुझे नहीं पता कि कैसे करना है y1range स्वचालित रूप से y1range * एक कारक सेट करें।

plot '-' using 1:($2*0.2248) with dots axes x1y2 lc rgb 'white' notitle, \ 
     '' using 1:2 with lines lc rgb '<color>' title '<title>' 

समाधान अक्सर ऊपर थोड़ा अलग y उत्पन्न करता है:

मेरे अंतिम समाधान दो बार साजिश, एक बार y1 पर न्यूटन में और एक बार y2 पर पाउंड में, और y2 भूखंड लगभग अदृश्य है तराजू: autoragne के साथ, gnuplot सीमा को गोल करता है ताकि प्रत्येक धुरी पर शीर्ष टिक एक गोल संख्या हो, और निश्चित रूप से गोलियां अलग-अलग इकाइयों के लिए अलग होती हैं।

अंत में मैं एक ग्राफ में सबसे ज्यादा जोर मूल्य पाता है कि अजगर कोड के साथ खत्म हो, उस नंबर और y2range उस नंबर पर * .2248 को yrange तो मैं स्पष्ट रूप से सेट:

f.write("set yrange [0:%s]; set y2range[0:%s]\n" % (peak_thrust, peak_thrust*NEWTON_LBF)); 

यहाँ अंतिम परिणाम है: http://www.lib.aero/hosted/motors/cesaroni_12-15-12.html (नीचे नमूना ग्राफ) enter image description here

+0

अच्छी जानकारी। नवंबर 2017 से धन्यवाद। हालांकि, मुझे लगता है कि आप "डॉट्स के साथ" कहते हैं और मुझे कोई बिंदु नहीं दिख रहा है। साथ ही, क्या आप दिखा सकते हैं कि आपका डेटाफाइल कैसा दिखता है? – SDsolar

उत्तर

16

मुझे ऐसा लगता है कि यह करने के लिए सबसे आसान तरीका है बस डेटा पैमाने पर करने के है:

set y2tics 
plot sin(x) w lines, 5*sin(x) w lines axes x1y2 

बेशक, आप एक फ़ाइल से डेटा की साजिश रचने कर रहे हैं, तो यह अधिक कुछ ऐसा दिखाई देगा:

set y2tics 
FACTOR=0.2248 #conversion factor from newtons to lbf 
plot 'datafile' u 1:2 w lines, '' u 1:(FACTOR*$2) w lines 

आप स्पष्ट रूप से yrange कर रहे हैं तो (तुम क्या करने की आवश्यकता हो सकती है):

set yrange [ymin:ymax] 
set y2range [ymin*FACTOR:ymax*FACTOR] 

अंत में, यदि आप वास्तव में ऑटोस्कलिंग पर भरोसा करना चाहते हैं, तो आपको कुछ "जिमनास्टिक" करने की आवश्यकता होगी।

सबसे पहले, एक डमी टर्मिनल तो एक साजिश बनाने के बिना हम कर सकते हैं plot सेट:

set term unknown 
plot 'datafile' u 1:2 #collect information on our data 

अब हम डेटा के बारे में जानकारी एकत्र किया है कि, हम अपने वास्तविक y2range

FACTOR=0.2248 
set y2range [FACTOR*GPVAL_Y_MIN : FACTOR*GPVAL_Y_MAX] 
set y2tics nomirror 
set ytics nomirror 

सेट कर सकते हैं अब टर्मिनल सेट करें और डेटा प्लॉट करें:

set term ... 
set output ... 
plot 'datafile' u 1:2 w lines 
+1

तो यह क्या आता है कि मुझे प्रत्येक वाई धुरी पर दो बार डेटा प्लॉट करने की आवश्यकता है? – iter

+0

@iter - मुझे लगता है कि वास्तव में नहीं। (मेरा अद्यतन कोड देखें)। यदि आप स्पष्ट रूप से y2range सेट करते हैं, तो आप इसके आसपास जा सकते हैं। – mgilson

+1

प्रत्येक कोड स्निपेट मैं प्लॉट्स के ऊपर दो बार देखता हूं (जो कि सीमा को स्पष्ट रूप से सेट करता है, जिसे मैं नहीं करना चाहता हूं; मैं ऑटोस्केल पर निर्भर हूं)। अंतिम स्निपेट दो बार भी प्लॉट करता है, यह सिर्फ पहली साजिश को दूर करता है (नकली टर्मिनल पर) – iter

2

मुझे पता है कि यह एक पुराना सवाल है और उत्तर पहले ही स्वीकार कर लिया गया है, लेकिन मुझे लगता है कि यह मेरे दृष्टिकोण को साझा करने लायक है।

मैं बस x2axis के लिए संशोधित लेबल का उपयोग करता हूं।आपके मामले में, यह होगा

set y2tics ("10" 10/0.2248, "20" 20/0.2248 etc etc... 

कि इस तरह से

do for [i=0:1000:10] { set y2tics add (sprintf("%i",i) i/0.2248) } 

जहां for रेंज अपने आंकड़ों के अनुसार समायोजित किया जाना चाहिए (आप stats और चर GPVAL_DATA_Y_MAX पूर्ण शांति के लिए इस्तेमाल कर सकते हैं लूप में चलाया जा सकता है मन की)।

set ytics nomirror 

इस के लिए मत भूलना दे देंगे आप के लिए वास्तव में क्या देख रहे हैं, (लगभग) एक एक लाइनर में: enter image description here

आप एक ग्रिड का उपयोग करना चाहते हैं और पर परिवर्तित कारकों है x2axis, ताकि लेबल y के उदाहरण के लिए = 50 एन y2 अनुरूप होगा = 11.2 (यह चीजों को स्वच्छ रखता है अगर आप एक ग्रिड का उपयोग) आप कर सकते हैं

do for [i=0:1000:50] { set y2tics add (sprintf("%5.1f",i*0.2248) } 

यह परिणाम है: enter image description here

+0

सेट करने के लायक है। धन्यवाद। – SDsolar

10

संस्करण 5.0 y और y2 (या भी x और x2) के बीच संबंधों के इस प्रकार के लिए समर्थन जोड़ा अक्ष:

set xrange[0:370] 
set ytics nomirror 
set y2tics 
set link y2 via 0.2248*y inverse y/0.2248 
plot x 

example for <code>set link</code>

+0

यदि मैं वाई और वाई 2 अक्ष दोनों लॉगरिदमिक हैं, तो मैं इसे काम नहीं कर सकता :(यहां एक चर्चा है [https://sourceforge.net/p/gnuplot/bugs/1736/) – vagoberto

+0

@vagoberto क्षमा करें, मदद नहीं कर सकता आप वहाँ हैं। मुझे लगता है कि यह बस काम नहीं करता है। मैंने वाई और वाई 2 को 'सेट नॉनलाइनर' (नए सीवीएस में जोड़ा गया) के साथ जोड़ने की कोशिश की, लेकिन आप उनको गठबंधन नहीं कर सकते। – Christoph

+0

इस जानकारी के लिए धन्यवाद।सीधे 'सेट लिंक y2 = वाई के संदर्भ में कुछ' के साथ काम करना सरल रूपांतरणों के लिए उत्कृष्ट है जैसे डीजी एफ एक तरफ और दूसरे पर डीजी सी। – SDsolar