2014-11-18 20 views
5

Tôi đang sử dụng GNUplot để vẽ quỹ đạo từ một tệp dữ liệu. Tôi muốn sử dụng autoscale xy để tập lệnh GNUplot không cần phải chỉnh sửa tùy thuộc vào dữ liệu. Tuy nhiên, khi tôi vẽ, autoscale không đặt xrange tương tự như yrange. Điều này làm cho quỹ đạo nhìn "đè bẹp".GNUplot Autoscale được đặt xrange bằng yrange

Tôi đã thử sử dụng set size squareset size ratio -1 How to set equal scale's length in gnuplot.

Nhưng điều này không hiệu quả.

Có cách nào để buộc autoscale để làm cho phạm vi x và y bằng nhau không?

Cảm ơn!

Trả lời

5

Không, không có tùy chọn để tự động chia tỷ lệ x và y thành các giá trị giống nhau. Đây là một giải pháp, làm thế nào bạn có thể làm điều này với một số thủ thuật.

Nếu bạn muốn giữ gnuplot của mở rộng các phạm vi đến tics tiếp theo, bạn có thể làm điều đó như sau:

Trước tiên, bạn phải vẽ một lần bằng cách sử dụng thiết bị đầu cuối unknown. Điều này tiết kiệm phạm vi x và y trong các biến gnuplot GPVAL_X_MIN, GPVAL_X_MAX, GPVAL_Y_MINGPVAL_Y_MAX. Sau đó, bạn thiết lập các dãy và replot:

set terminal push # save current terminal 
set terminal unknown 
plot 'datafile' 
set terminal pop # restore previous terminal 

min = (GPVAL_Y_MIN < GPVAL_X_MIN ? GPVAL_Y_MIN : GPVAL_X_MIN) 
max = (GPVAL_Y_MAX > GPVAL_X_MAX ? GPVAL_Y_MAX : GPVAL_X_MAX) 

set xrange[min:max] 
set yrange[min:max] 
set size ratio -1 

replot 

Những thứ push/pop được yêu cầu chỉ nếu bạn muốn giữ lại các thiết lập thiết bị đầu cuối ban đầu.

Để làm cho việc tái sử dụng được, ví dụ: để sử dụng với multiplot, bạn có thể bọc tất cả những lệnh bên trong một chuỗi và gọi eval vào nó:

autoscale_xy(datafile) = \ 
    "set terminal push; set terminal unknown; set autoscale;".\ 
    "plot '".datafile."'; set terminal pop;".\ 
    "min = (GPVAL_Y_MIN < GPVAL_X_MIN ? GPVAL_Y_MIN : GPVAL_X_MIN);".\ 
    "max = (GPVAL_Y_MAX > GPVAL_X_MAX ? GPVAL_Y_MAX : GPVAL_X_MAX);".\ 
    "set xrange[min:max]; set yrange[min:max];" 
... 

files = "first second third fourth" 
do for [f in files] { 
    eval(autoscale_xy(f)) 
    plot f 
} 

Một lựa chọn khác sẽ được sử dụng để tính toán stats tối đa và tối thiểu x-và y-giá trị và thiết lập các dãy phù hợp:

stats 'datafile' using 1:2 nooutput 
min = (STATS_min_y < STATS_min_x ? STATS_min_y : STATS_min_x) 
min = (STATS_max_y > STATS_max_x ? STATS_max_y : STATS_max_x) 

sc = 1.05 
set xrange[sc*min:sc*max] 
set yrange[sc*min:sc*max] 
set size ratio -1 

plot 'datafile' 
+0

Cảm ơn giải pháp. Tuy nhiên, phương pháp này khá thất vọng, vì tôi đang sử dụng 'multiplot' để vẽ đồ thị 4 từ các cột khác nhau trong tệp dữ liệu. phải làm điều này cho mỗi tập dữ liệu không phải là lý tưởng, nhưng hoàn toàn khả thi. – Rohan

+0

Vâng, thực sự. Tôi cập nhật câu trả lời của mình để chỉ cho bạn cách bạn có thể đặt tất cả những thứ này vào một chuỗi và sử dụng 'eval' để làm cho nó có thể tái sử dụng được. – Christoph

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