2016-02-20 16 views
11

Mam plik danych .csv utworzony przez inną aplikację innej firmy, który powinien zostać wykreślony przy użyciu gnuplot. Załóżmy, że plik ma następujący format:Gnuplot: Najkrótszy sposób ignorowania pierwszego wiersza pliku danych

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 

pierwszej kolumnie jest oś x, następujące kolumny należy przedstawić na wykresie jako własnego lineplot (tak, wiem, zbyt wiele działek linii w jednej działki może wyglądają źle, ale żeby się zorientować). Tutaj MCVE:

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" 

Problem polega na tym, że to także kreśli pierwszy wiersz, tak jak byłoby to dane.

Wiem, że można zignorować dowolny wiersz w pliku danych, uruchamiając go z #, jak #1;2;3;4;5;6, ale nie chcę edytować pliku, ponieważ jest on również używany przez inne narzędzia.

Innym sposobem jest użycie plot <filename> every ::1 ignorować pierwszą linię, co oznaczałoby, że musiałbym to every ::1 5 razy w powyższym scenariuszu, jak wyjaśniono in this link. To będzie wyglądać następująco:

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" 

jest zdefiniowanie every ::1 dla każdej działki naprawdę jedyny sposób? Czy istnieje jakiś krótszy - najlepiej jeden - liniowy - sposób ignorowania pierwszej (ych) linii; jakiś sposób zdefiniowania globalnego "every ::1" lub czegoś podobnego (pseudokod) set datafile ignorefirstnlines 1?

+0

Czy 'every :: 1' naprawdę jest takie złe? Wydaje mi się to eleganckie. Skąd pochodzą napisy tytułowe "B", "C" itp.? Czy są nagłówkami kolumn? – e0k

+1

Nie "tak źle", ale uznałbym to za bardziej eleganckie, gdyby można to było zrobić w jednym oświadczeniu zamiast w każdym spisku. Jeśli wyobrażam sobie wykres słupkowy z 5 różnymi paskami i dodatkowymi paskami błędów, to spowoduje to 10 instrukcji narysowania, a zatem 10 "every :: 1". I tak, '" A "," "B" 'itp. To tylko przykładowe nagłówki kolumn, które powinny być wyświetlane w kluczu/legendzie. –

+1

Czy wiesz o iteracji wykresu? Wpisz 'help plot iteration' z monitu' gnuplot'. – e0k

Odpowiedz

17

Gnuplot może odczytywać nazwy kolumn z pierwszego wiersza, ale nadal można normalnie określać nazwy kolumn. Dlatego skutecznie pomija pierwszą linię.

Wydaj polecenie

set key autotitle columnhead 

ten nakazuje gnuplot, że pierwsza linia nie jest dane, ale to nazwy kolumn mają być stosowane do klucza. Wciąż możesz unset key lub plot datafile title sometitle zrobić to samo, co wcześniej, a gnuplot po prostu nie użyje tych danych.

Załóżmy, że mój plik wygląda

1 2 
4 5 
7 8 

mogę po prostu wydać set key autotitle columnhead follwed przez unset key (jeśli naprawdę nie chce klucz), a to pominięcie pierwszego wiersza.

enter image description here


Ewentualnie mogę rura moich danych przez zewnętrzny program. Na przykład za pomocą awk (który jest dostępny dla większości systemów operacyjnych w tym Windows), mogę zrobić

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

pominąć pierwsze 2 linie (używając Windows, muszę zrobić '< awk "(NR>2){print;}" datafile'). Jeśli nie chcesz, aby wpisywać ten można przechowywać w ten ciąg

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

i używać go jako makro (dla Windows, użyj skipfile = '"< awk \"(NR>2){print;}\" datafile"').Na przykład, aby wykreślić pliku danych przy użyciu linii, mogę zrobić

plot @skipfile with lines 

@skipfile właśnie opowiada gnuplot traktować polecenia jakbym właśnie wpisany zawartość skipfile właśnie tam.

+2

Pamiętaj, aby włączyć makra z 'ustawionymi makrami 'przed użyciem dowolnego' @'. – e0k

+0

Jeśli makra nie działają, wypróbuj polecenie sugerowane przez @ e0k, a następnie spróbuj ponownie. Jednak nie spotkałem jeszcze instalacji gnuplot, która musiałem wydać tego polecenia. – Matthew

+1

Dziękuję bardzo! To wydaje się być dokładnie tym, czego chciałem, a ja też błądziłem, jeśli coś takiego "@" było możliwe. Dwie odpowiedzi w jednym :) –

Powiązane problemy