Cấu trúc vòng lặp bên trong gnuplot?


82

Có cách nào để truy xuất lặp lại dữ liệu từ nhiều tệp và vẽ chúng trên cùng một biểu đồ trong gnuplot. Giả sử tôi có các tệp như data1.txt, data2.txt ...... data1000.txt; mỗi cột có cùng số cột. Bây giờ tôi có thể viết một cái gì đó như-

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"

Nhưng điều này sẽ thực sự bất tiện. Tôi đã tự hỏi liệu có cách nào để lặp lại phần cốt truyện trong gnuplot không.


Thực sự ấm cúng bashchức năng trong câu trả lời dưới đây
Hastur

Câu trả lời:


96

Chắc chắn là có (trong gnuplot 4.4+):

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

Biến icó thể được hiểu là một biến hoặc một chuỗi, vì vậy bạn có thể làm điều gì đó như

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

nếu bạn muốn có các dòng lệch nhau.

help iterationvào dòng lệnh gnuplot để biết thêm thông tin.

Cũng nhớ xem câu trả lời của @ DarioP về do forcú pháp; cung cấp cho bạn một cái gì đó gần hơn với forvòng lặp truyền thống .


Cảm ơn giải pháp của bạn "plot for [i = 1: 1000] 'data'.i.'. Txt 'using 1: 2 title' Flow '.i" đã hiệu quả với tôi .. Tôi đang sử dụng gnuplot 5.2 với C ++ trên Windows .. ..
MasoodUrRehman

Nhưng tôi có một vấn đề khác, tôi đang viết một chương trình ghi K số tệp trên đĩa cứng từ fream K là một biến toàn cục, vì vậy, tôi muốn vẽ biểu đồ K số tệp trên biểu đồ của mình bằng cách sử dụng gnuplot mà tôi đã thử cho [i = 1 : K] nhưng nó cho lỗi của biến không xác định. Tôi đã thử vòng lặp for bên ngoài từ gnuplot nhưng điều đó cũng không hoạt động.
MasoodUrRehman

Tôi đã viết một hàm trong C ++ cho gnuplot rằng làm việc với cho [i = 1: 5] nhưng khi tôi sử dụng cho cho [i = 1: K] nó mang lại cho lỗi ...
MasoodUrRehman

@MasoodUrRehman, có vẻ như bạn đang cố gắng sử dụng một biến từ mã C ++ trong tập lệnh gnuplot của mình; đảm bảo rằng bạn đang in giá trị của biến K khi bạn gửi lệnh tới gnuplot. Gnuplot đang nói 'biến không xác định' vì C ++ biết K là gì nhưng gnuplot thì không. Nếu bạn vẫn gặp khó khăn, bạn có thể đăng vấn đề của mình dưới dạng một câu hỏi C ++ riêng biệt.
andyras

83

Cũng hãy xem do { ... }lệnh kể từ gnuplot 4.6 vì nó rất mạnh:

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
Tôi cũng có thể sử dụng trình lặp t để tham chiếu đến một chỉ mục trong một mảng các tên hoặc màu tệp ví dụ không?
tommy.carstensen

1
Tôi chưa bao giờ thử nhưng tôi không thấy có vấn đề gì với điều đó. Cuối cùng, khả năng khác là chỉ định các mục của mảng (màu sắc, tên hoặc bất cứ thứ gì) trực tiếp trong dấu ngoặc vuông, như được hiển thị trong help do.
DarioP

1
Tôi đã hỏi một câu hỏi mới tại đây stackoverflow.com/questions/18591986/loop-over-array-in-gnuplot , bởi vì tôi không rõ, làm cách nào để đạt được điều này.
tommy.carstensen

10

Tôi có kịch bản tất cả. P

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

Ở đây hai hàng cuối cùng là nghĩa đen, không phải heuristic. Sau đó tôi chạy

$ gnuplot -p all.p

Thay đổi *.datloại tệp bạn có hoặc thêm các loại tệp.

Bước tiếp theo: Thêm vào ~ / .bashrc dòng này

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

và đặt tệp của bạn vào thư mục chính all.pcủa bạn và thì đấy. Bạn có thể vẽ tất cả các tệp trong bất kỳ thư mục nào bằng cách gõ p và enter.

CHỈNH SỬA Tôi đã thay đổi lệnh vì nó không hoạt động. Trước đây nó chứa list(i)=word(system(ls -1B *.dat),i).


Đối với tôi mã của bạn không hoạt động. Tôi đã phải viết list=system(ls -1B *.dat)thay thế.
Jaxan

HM OK. Tôi đã sử dụng phiên bản 4.6 trên Linux.
Jonatan Öström

1
Vì vậy, tôi đã thử lại, và như bạn nói nó không hoạt động. Tôi đã sử dụng quảng cáo dấu nháy đơn trong cuộc gọi hệ thống cho lệnh của bạn để làm việc:list=system('ls -1B *.dat')
Jonatan Ostrom

nó không làm việc cho tôi. có hoặc không có dấu ngoặc kép. tại sao?
samira

@samira Tôi không biết.
Jonatan Öström

4

Sử dụng phần sau nếu bạn có các cột rời rạc để vẽ biểu đồ

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

Chỉ cung cấp ví dụ ở đây cho thấy cách lặp qua các số không liên tiếp.
rehctawrats

2

Tôi muốn sử dụng các ký tự đại diện để vẽ nhiều tệp thường được đặt trong các thư mục khác nhau, trong khi làm việc từ bất kỳ thư mục nào. Giải pháp tôi tìm thấy là tạo hàm sau trong~/.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
}

và sử dụng nó, ví dụ như plo *.dat ../../dir2/*.out, để vẽ tất cả .datcác tệp trong thư mục hiện tại và tất cả .outcác tệp trong một thư mục tình cờ được nâng cấp và được gọi dir2.


Bạn có thể thêm plo() { [[ $# -eq 0 ]] && echo "Usage plo file1 file2 ..." || { .... } }để tránh cuộc gọi gnuplotmà không có tệp.
Hastur

0

Đây là lệnh thay thế:

gnuplot -p -e 'plot for [file in system("find . -name \\*.txt -depth 1")] file using 1:2 title file with lines'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.