2012-05-30 27 views
7

Tại sao khi tôi làm cho mã này của gnuplot nó làm việc:Tất cả các điểm y giá trị không xác định trên gnuplot

set terminal postscript enhanced color 
set output '../figs/ins_local.ps' 

set title "Result" 

set logscale y 
set xrange [50:100] 
set xtics 5 

#set xlabel "Insertion" 
#set ylabel "Time (in microseconds) " 

plot sin(x) 

nhưng khi tôi thay đổi plot sin(x) với:

plot "../myFile.final" with lines title "Somethings" lw 3 linecolor rgb "#29CC6A" 

tôi có lỗi này:

plot "../myFile.final" with lines title "Somethings" lw 3 linecolor rgb "#29CC6A" 
                          ^
"local.gnuplot", line 16: all points y value undefined 

Tôi đã dùng một cột! nó đại diện cho yrange. xrange được thể hiện bằng số dòng! ví dụ về datapoint tôi:

125456 
130000 
150000 

điểm đầu tiên của x là 1, điểm thứ hai của x là 2, và cuối cùng là 3. bây giờ tôi muốn represente này 1, 2, 3 bởi một quy mô 50, 55, 60 !

+0

Nội dung của '../ myFile.final' là gì? – mgilson

+0

Nó nằm ngoài thư mục hiện tại! một cách nội dung của tôi là sự thật! – Mehdi

Trả lời

16

Có một vài điều có thể xảy ra ở đây - mà không thấy datafile của bạn thì không thể nói được. Một cặp vợ chồng mà tôi có thể nghĩ ra khỏi đỉnh đầu của tôi là:

Tất cả datapoints của bạn trong cột 2 đều nhỏ hơn hoặc bằng 0 (Bạn nhận được thông báo lỗi vì log (0) là undefined)

Bạn không có bất kỳ điểm nào trong cột đầu tiên từ 50 đến 100. Trong trường hợp này, tất cả các vị trí dữ liệu của bạn bị cắt bớt khỏi phạm vi ô vì set xrange [50:100]

Tập dữ liệu của bạn chỉ có 1 cột ... Trong trường hợp này , gnuplot không thấy bất kỳ giá trị y nào. (Thay đổi để plot '../myFile.final' u 1 ...)

EDIT

Ok, bây giờ mà tôi nhìn thấy datafile của bạn, vấn đề chắc chắn là bạn đã set xrange [50:60] nhưng dữ liệu của bạn xrange chỉ chạy 0-2 (gnuplot bắt đầu lập chỉ mục datafile từ 0). Cách dễ nhất để sửa lỗi này là sử dụng cột giả 0. Cột giả 0 đơn giản là số dòng bắt đầu từ 0 (đó là những gì gnuplot vẽ trên trục x nếu bạn làm plot 'blah.txt' using 1. Dưới đây là ví dụ:

scale_x(x,xmin,xmax,datamin,datamax)=xmin+(xmax-xmin)/(datamax-datamin)*x 
plot 'test.dat' using (scale_x($0,50,60,0,2)):1 w lines title "scaled xrange" 

Lưu ý rằng nếu bạn không biết làm thế nào đặc tả sử dụng công trình, số trước bằng $ là hoạt động tố khôn ngoan trên đó toàn bộ cột Ví dụ:.

plot 'foo.bar' using 1:($2+$3) 

sẽ vẽ cột đầu tiên cộng với tổng của các phần tử thứ 2 và thứ ba trong mỗi hàng của tệp dữ liệu.

Giải pháp này giả định rằng bạn biết giá trị lớn nhất của x trong datafile của bạn (trong trường hợp này, đó là 3-1 = 2 - [ba điểm, 0,1,2]). Nếu bạn không biết số lượng datapoints, bạn có thể nhận được rằng bằng cách sử dụng phép thuật vỏ, hoặc trực tiếp từ gnuplot. Cách thứ nhất dễ dàng hơn một chút, mặc dù không phải là di động. Tôi sẽ hiển thị cả:

XMAX=`wc -l datafile | awk '{print $1-1}'` 
scale_x(x,xmin,xmax,datamin,datamax)=xmin+(xmax-xmin)/(datamax-datamin)*x 
plot 'test.dat' using (scale_x($0,50,60,0,XMAX)):1 w lines title "scaled xrange" 

Cách thứ hai, chúng ta cần phải thực hiện hai đường chuyền qua các dữ liệu và để gnuplot nhặt tối đa:

set term push #save terminal settings 
set term unknown #use unknown terminal -- doesn't actually make a plot, only collects stats 
plot 'test.dat' u 0:1 #collect stats 
set term pop #restore terminal settings 
XMIN=GPVAL_X_MIN #should be 0, set during our first plot command 
XMAX=GPVAL_X_MAX #should be number of lines-1, collected during first plot command 
scale_x(x,xmin,xmax,datamin,datamax)=xmin+(xmax-xmin)/(datamax-datamin)*x 
plot 'test.dat' using (scale_x($0,50,60,XMIN,XMAX)):1 w lines title "scaled xrange" 

Tôi cho rằng cho đầy đủ, tôi nên nói rằng điều này cũng dễ dàng hơn trong gnuplot 4.6 (Tôi không có nó được cài đặt ngay bây giờ, vì vậy phần tiếp theo này xuất phát từ sự hiểu biết của tôi về các tài liệu):

stats 'test.dat' using 0:1 name "test_stats" 
#at this point, your xmin/xmax are stored in the variables "test_stats_x_min"/max 
XMIN=test_stats_x_min 
XMAX=test_stats_x_max 
scale_x(x,xmin,xmax,datamin,datamax)=xmin+(xmax-xmin)/(datamax-datamin)*x 
plot 'test.dat' using (scale_x($0,50,60,XMIN,XMAX)):1 w lines title "scaled xrange" 

Gnuplot 4.6 trông khá tuyệt. Có lẽ tôi sẽ sớm bắt đầu chơi với nó khá sớm.

+0

tôi đã chỉnh sửa bài đăng của mình :) – Mehdi

+0

@Mehdi - Tôi cũng đã chỉnh sửa bài đăng của mình. Nó khá chi tiết, nhưng hy vọng nó đủ dễ hiểu. – mgilson

+0

Tuyệt vời là công việc, một câu hỏi cuối cùng xin vui lòng: khi bạn thực hiện: 'plot 'test.dat' sử dụng (scale_x ($ 0,50,60, XMIN, XMAX)): 1' có nghĩa là gì: ': 1 '? – Mehdi

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