2016-02-20 4 views
11

में पहली पंक्ति को अनदेखा करने का सबसे छोटा तरीका मेरे पास एक अन्य तृतीय पक्ष एप्लिकेशन द्वारा बनाई गई .csv डेटाफ़ाइल है जिसे gnuplot का उपयोग करके प्लॉट किया जाना चाहिए। की फाइल मान लेते हैं निम्नलिखित प्रारूप है:ग्नुपलॉट: डेटाफाइल

1;2;3;4;5;6 <-- This is the header line that should be ignored (with values 1;2;...;N) 
1;1;2;1;1;1 
2;3;3;3;5;6 
3;4;1;1;1;4 

पहले कॉलम x- अक्ष के लिए निम्नलिखित कॉलम प्रत्येक खुद lineplot के रूप में साजिश रची किया जाना चाहिए (हाँ, मुझे पता है, एक साजिश के भीतर भी कई लाइन भूखंडों है हो सकता है बुरा लग रहा है, लेकिन सिर्फ एक विचार पाने के लिए)। यहां एक एमसीवीई:

set terminal png size 1000,500  
set datafile separator ";" # CSV file is seperated with ; 
plot \ 
    'C://tmp/test.csv' using 1:2 with lines title "A",\ 
    'C://tmp/test.csv' using 1:3 with lines title "B",\ 
    'C://tmp/test.csv' using 1:4 with lines title "C",\ 
    'C://tmp/test.csv' using 1:5 with lines title "D",\ 
    'C://tmp/test.csv' using 1:6 with lines title "E" 

समस्या यह है कि यह पहली पंक्ति भी प्लॉट करता है क्योंकि यह डेटा होगा।

मुझे पता है कि # के साथ इसे #1;2;3;4;5;6 से शुरू करके डेटाफाइल में किसी भी पंक्ति को अनदेखा कर सकते हैं, फिर भी मैं फ़ाइल को संपादित नहीं करना चाहता, क्योंकि यह अन्य टूल्स द्वारा भी उपयोग किया जाता है। के रूप में समझाया in this link

एक और तरीका है, plot <filename> every ::1 उपयोग करने के लिए पहली पंक्ति है, जो मतलब यह होगा कि मैं ऊपर स्क्रिप्ट में every ::1 5 बार शामिल करने के लिए होता अनदेखी करने के लिए है। यह निम्नलिखित दिखाई देगा:

set terminal png size 1000,500  
set datafile separator ";" # CSV file is seperated with ; 
plot \ 
    'C://tmp/test.csv' every ::1 using 1:2 with lines title "A",\ 
    'C://tmp/test.csv' every ::1 using 1:3 with lines title "B",\ 
    'C://tmp/test.csv' every ::1 using 1:4 with lines title "C",\ 
    'C://tmp/test.csv' every ::1 using 1:5 with lines title "D",\ 
    'C://tmp/test.csv' every ::1 using 1:6 with lines title "E" 

हर साजिश वास्तव में एक ही रास्ता के लिए every ::1 को परिभाषित कर रहा है? क्या कुछ छोटा - बेहतर एक-लाइनर है - पहली (एन) रेखा को अनदेखा करने का तरीका; every ::1 "वैश्विक रूप से" या कुछ (छद्म कोड) set datafile ignorefirstnlines 1 को परिभाषित करने का कोई तरीका?

+0

क्या हर :: 1' वास्तव में इतना बुरा है? यह मेरे लिए सुरुचिपूर्ण लगता है। शीर्षक स्ट्रिंग कहां 'बी" ', '" सी "' आदि कहां से आते हैं? क्या वे कॉलम हेडर हैं? – e0k

+1

"इतना बुरा नहीं", लेकिन अगर यह हर साजिश में बजाय एक कथन में किया जा सकता है तो मुझे यह अधिक सुरुचिपूर्ण लगेगा। अगर मैं 5 अलग-अलग सलाखों के साथ एक बार साजिश की कल्पना करता हूं, और अतिरिक्त त्रुटि बार, तो इसके परिणामस्वरूप 10 साजिश बयान होंगे, और इसलिए 10 'हर :: 1'। और हां, '" ए "', '" बी "' इत्यादि सिर्फ उदाहरण कॉलम हेडर हैं जिन्हें कुंजी/किंवदंती में दिखाया जाना चाहिए। –

+1

क्या आप प्लॉट पुनरावृत्ति के बारे में जानते हैं? 'Gnuplot' प्रॉम्प्ट से 'सहायता साजिश पुनरावृत्ति' टाइप करें। – e0k

उत्तर

17

ग्नुपलॉट पहली पंक्ति से कॉलम नाम पढ़ सकता है, लेकिन आप अभी भी कॉलम नामों को सामान्य रूप से भी निर्दिष्ट कर सकते हैं। इसलिए, यह प्रभावी रूप से पहली पंक्ति को छोड़ देता है।

जारी आदेश

set key autotitle columnhead 

यह gnuplot बताता है कि पहली पंक्ति डेटा नहीं है, लेकिन स्तंभ नाम कुंजी का उपयोग करने के लिए है। आप अभी भी unset key या plot datafile title sometitle जितना हो सके उतना ही कर सकते हैं, और gnuplot उस डेटा का उपयोग नहीं करेगा।

मान लीजिए कि

तरह
1 2 
4 5 
7 8 

मैं सिर्फ set key autotitle columnheadunset key द्वारा follwed (अगर मैं नहीं है वास्तव में एक प्रमुख चाहते हैं) जारी कर सकते हैं मेरी फाइल लग रहा है, और यह पहली पंक्ति को छोड़ देगा।

enter image description here


वैकल्पिक रूप से, मैं एक बाहरी कार्यक्रम के माध्यम से पाइप मेरे डेटा कर सकते हैं। उदाहरण के लिए, awk (जो सबसे ओएस विंडोज सहित के लिए उपलब्ध है) का उपयोग कर, मैं

plot "< awk '(NR>2){print;}' datafile" 

पहले 2 लाइनों को छोड़ कर सकते हैं (Windows का उपयोग कर, मैं '< awk "(NR>2){print;}" datafile' करना चाहिए)। मैं इस टाइप रखने के लिए नहीं करना चाहते हैं, मैं एक स्ट्रिंग

skipfile = "\"< awk '(NR>2){print;}' datafile\"" 

में यह स्टोर कर सकते हैं और किसी मैक्रो के रूप में उपयोग (Windows के लिए, skipfile = '"< awk \"(NR>2){print;}\" datafile"' उपयोग करें)।उदाहरण के लिए, लाइनों का उपयोग कर datafile प्लॉट करने के लिए, मैं

plot @skipfile with lines 

@skipfile सिर्फ आदेश के इलाज के लिए की तरह मैं सिर्फ skipfile की सामग्री को वहीं लिखा हो gnuplot बताता है कर सकता है।

+2

किसी भी '@' का उपयोग करने से पहले 'सेट मैक्रोज़' के साथ मैक्रोज़ चालू करना सुनिश्चित करें। – e0k

+0

यदि मैक्रोज़ काम नहीं करते हैं, तो @ e0k द्वारा सुझाए गए आदेश को आज़माएं और फिर उन्हें पुनः प्रयास करें। हालांकि, मुझे अभी तक gnuplot की स्थापना का सामना नहीं हुआ है जिसे मुझे उस आदेश को जारी करना पड़ा है। – Matthew

+1

बहुत बहुत धन्यवाद! ऐसा लगता है कि मैं वही चाहता था, और अगर मैं ऐसा कुछ भी संभव था तो मैं भी भटक गया। एक में दो जवाब :) –

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