2011-01-27 42 views
6

Tôi có dữ liệu được tạo trong mô phỏng. Các tập tin dữ liệu được tạo trông giống như sau:Vẽ các mũi tên với gnuplot

1990/01/01 99 
1990/01/02 92.7 
1990/01/03 100.3 
1990/01/04 44.2 
1990/01/05 71.23 
... 
2100/01/01 98.25 

tôi có thể tạo ra một biểu đồ (trivially), bằng cách đơn giản ban hành lệnh (dài phiên bản):

plot "simulation.dat" using 1:2 with line 

Tôi muốn thêm một cột thứ ba sẽ thêm thông tin mũi tên. Mã hóa cho cột thứ ba sẽ là như sau:

  • 0 => không có mũi tên để được rút ra cho rằng giá trị trục x
  • 1 => một hướng lên mũi tên để được rút ra cho giá trị x trục
  • 2 => mũi tên XUỐNG được vẽ cho giá trị trục x

Tôi mới bắt đầu học gnuplot và sẽ đánh giá cao trợ giúp về cách sử dụng gnuplot để tạo mũi tên trên ô đầu tiên?

+0

Xin chào, tôi nghĩ rằng tôi có câu hỏi gnuplot của bạn hoạt động (trên Linux ít nhất) Tôi đã cập nhật câu trả lời của mình. – Tom

Trả lời

3

Tôi không nghĩ rằng có một cách tự động để tạo tất cả các mũi tên của bạn cùng một lúc dựa trên cột thứ ba. Bạn sẽ phải thực hiện như sau cho mỗi mũi tên mà bạn muốn:

set arrow xval1,yval1 to xval2,yval2 

Bạn cũng có thể sử dụng mũi tên tương

set arrow xval1,yval1 rto 1,0 

này sẽ vẽ một mũi tên ngang từ xval1, yval1 đến (xval1 + 1) , yval1

plenty of options associated with the set arrow command:

3

Nếu bạn không muốn người đứng đầu mũi tên sau đó bạn có thể thử các xung phong cách (với xung lực hơn là với dòng) (Nếu bạn vẫn muốn các dòng trên đầu thì bạn có thể vẽ hai lần).

Nếu bạn thực sự muốn đầu mũi tên thì những điều sau đây có thể hữu ích: Nó sử dụng vòng lặp for (hoặc sắp xếp) để thêm mũi tên dọc vào ô.

Gnuplot script, for loop within or adding to existing plot

Cụ thể:

tạo ra một tập tin simloop.gp trông giống như sau:

count = count+1 
#save the count to count.gp 
system 'echo '.count.' > count.gp' 
#load the simloop shell 
system "./simloop.sh" 

#draw the arrow 
load 'draw_arrow.gp' 

if(count<max) reread 

Sau đó tạo một file simloop.sh trông giống như vậy

#!/bin/bash 

#read the count 
count=$(awk -F, '{print $1}' count.gp) 
#read the file 
xcoord=$(awk -v count=$count -F, 'BEGIN{FS=" ";}{ if(NR==count) print $1}' simulation.dat) 
ycoord=$(awk -v count=$count -F, 'BEGIN{FS=" "}{ if(NR==count) print $2}' simulation.dat) 
dir=$(awk -v count=$count -F, 'BEGIN{FS=" "}{ if(NR==count) print $3}' simulation.dat) 

#choose the direction of the arrow 
if [ \"$dir\" == \"0\" ]; then 
    echo '' > draw_arrow.gp 
fi 

if [ \"$dir\" == \"1\" ]; then 
    echo 'set arrow from ' $xcoord' ,0 to '$xcoord','$ycoord' head' > draw_arrow.gp 
fi 

if [ \"$dir\" == \"2\" ]; then 
echo 'set arrow from '$xcoord',0 to '$xcoord','$ycoord' backhead' > draw_arrow.gp 
fi 

Sau đó, tạo tệp simulation.gp trông như vậy mething như vậy:

count = 0; 
max = 5; 
load "simloop.gp" 
set yrange[0:*] 
plot "simulation.dat" u 1:2 w l 

Đảm bảo tệp vỏ có quyền thực thi (chmod + wrx simloop.sh), tải lên gnuplot và gõ

load "./simulation.gp" 

này làm việc cho tôi với các tập tin dữ liệu

1 99 0 
2 92.7 1 
3 100.3 2 
4 44.2 0 
5 71.23 1 

(Để thử nghiệm tôi đã thoát khỏi thời gian định dạng Bạn sẽ có thể đặt nó trở lại mà không cần quá nhiều rắc rối)

Sau đó, tôi nhận được biểu đồ này:. enter image description here

Mà tôi nghĩ là nhiều hơn hoặc ít hơn những gì bạn muốn.

+0

Thực hiện tốt, tôi luôn gọi gnuplot từ mã khác vì vậy tôi đã không nhận ra rằng tập lệnh như vậy không quá phức tạp. Tuy nhiên, tôi nghĩ rằng nếu bạn tự tạo ra inputfile thì có thể dễ dàng nhất để vẽ các mũi tên cùng lúc trong mã của bạn. Nếu không phải giải pháp này là hoàn hảo! – Martin

+0

cảm ơn cho đầu vào. Tuy nhiên, cách tiếp cận của bạn hơi phức tạp một chút đối với tôi (tôi không rên rỉ và lúng túng quá tốt;) – oompahloompah

1

Mặc dù câu hỏi khá cũ, đây là câu trả lời của tôi.

Người ta có thể sử dụng phong cách vectors âm mưu, có thể sử dụng arrowstyles biến dựa trên giá trị của một cột:

set style arrow 1 backhead 
set style arrow 2 head 
set yrange[0:*] 
set xdata time 
set timefmt "%Y/%m/%d" 
plot "simulation.dat" using 1:2 with line,\ 
    "" using 1:2:(0):(-$2):($3 == 0 ? 1/0 : $3) with vectors arrowstyle variable 

Nó giá trị của một cột là 1/0, điểm được coi là không xác định và được bỏ qua.

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