2016-02-20 27 views
11

Tôi có tệp dữ liệu .csv được tạo bởi ứng dụng bên thứ ba khác cần được vẽ bằng cách sử dụng gnuplot. Giả sử các tập tin có định dạng sau:Gnuplot: Cách ngắn nhất để bỏ qua dòng đầu tiên trong datafile

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 

Cột đầu tiên là trục x, các cột sau mỗi nên được vẽ như lineplot riêng (vâng, tôi biết, quá nhiều thửa dòng trong một âm mưu có thể nhìn xấu, nhưng chỉ để có được một ý tưởng). Dưới đây là 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" 

Vấn đề là, điều này cũng vẽ đường đầu tiên là dữ liệu.

Tôi biết rằng có thể bỏ qua bất kỳ dòng nào trong tệp dữ liệu bằng cách bắt đầu bằng #, như #1;2;3;4;5;6, nhưng tôi không muốn chỉnh sửa tệp, vì nó cũng được sử dụng bởi các công cụ khác.

Cách khác là sử dụng plot <filename> every ::1 để bỏ qua dòng đầu tiên, điều này có nghĩa là tôi sẽ phải bao gồm every ::1 5 lần trong tập lệnh ở trên, như được giải thích in this link. Điều này sẽ trông giống như sau:

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" 

Định nghĩa every ::1 cho mỗi âm mưu thực sự là cách duy nhất? Có một số ngắn hơn - thích hợp hơn một lớp lót - cách bỏ qua (các) dòng đầu tiên (n); một số cách để xác định every ::1 "toàn cầu" hoặc một cái gì đó như (mã giả) set datafile ignorefirstnlines 1?

+0

Có phải 'mỗi :: 1' thực sự quá tệ? Nó có vẻ thanh lịch với tôi. Các chuỗi tiêu đề "" B "', '" C "', v.v., đến từ đâu? Chúng có phải là tiêu đề cột không? – e0k

+1

Không phải là "quá xấu", nhưng tôi sẽ thấy nó thanh lịch hơn nếu điều này có thể được thực hiện trong một tuyên bố thay vì trong mọi cốt truyện. Nếu tôi tưởng tượng của một âm mưu thanh với 5 thanh khác nhau, và các thanh lỗi bổ sung, điều này sẽ dẫn đến 10 câu lệnh lô, và do đó 10 'mỗi :: 1'. Và có, '" A "', '" B "', v.v. chỉ là các tiêu đề cột ví dụ sẽ được hiển thị trong khóa/chú giải. –

+1

Bạn có biết về lặp lại lô không? Gõ 'plot plot iteration' từ dấu nhắc' gnuplot'. – e0k

Trả lời

17

Gnuplot có thể đọc tên cột từ dòng đầu tiên, nhưng bạn vẫn có thể chỉ định tên cột thông thường. Do đó, điều này có hiệu quả bỏ qua dòng đầu tiên.

Issue lệnh

set key autotitle columnhead 

này cho gnuplot rằng dòng đầu tiên không phải là dữ liệu, nhưng là tên cột được sử dụng để chìa khóa. Bạn vẫn có thể unset key hoặc plot datafile title sometitle giống như trước đây và gnuplot sẽ không sử dụng dữ liệu đó.

Giả sử rằng tập tin của tôi trông giống như

1 2 
4 5 
7 8 

Tôi chỉ có thể phát hành set key autotitle columnhead follwed bởi unset key (nếu tôi không thực sự muốn có một chìa khóa), và nó sẽ bỏ qua dòng đầu tiên.

enter image description here


Ngoài ra, tôi có thể đường ống dữ liệu của mình thông qua một chương trình bên ngoài. Ví dụ, sử dụng awk (trong đó có sẵn cho hầu hết các hệ điều hành bao gồm Windows), tôi có thể làm

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

bỏ qua 2 dòng đầu tiên (sử dụng Windows, tôi phải làm gì '< awk "(NR>2){print;}" datafile'). Nếu tôi không muốn giữ lại gõ những dòng này, tôi có thể lưu trữ này trong một chuỗi

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

và sử dụng nó như một macro (dành cho Windows, sử dụng skipfile = '"< awk \"(NR>2){print;}\" datafile"').Ví dụ, để âm mưu datafile sử dụng dây chuyền, tôi có thể làm

plot @skipfile with lines 

Các @skipfile chỉ nói với gnuplot để điều trị các lệnh như tôi vừa gõ nội dung của skipfile ngay tại đó.

+2

Đảm bảo bật macro bằng 'macro đặt trước 'khi bạn sử dụng bất kỳ' @ 'nào. – e0k

+0

Nếu các macro không hoạt động, hãy thử lệnh được đề xuất bởi @ e0k và sau đó thử lại. Tuy nhiên, tôi chưa gặp phải cài đặt gnuplot mà tôi đã phải đưa ra lệnh đó. – Matthew

+1

Cảm ơn bạn rất nhiều! Điều này có vẻ là chính xác những gì tôi muốn, và tôi cũng đi lang thang nếu một cái gì đó như thế này '@' là có thể. Hai câu trả lời trong một :) –

Các vấn đề liên quan