2014-11-18 3 views
5

Я использую GNUplot для построения орбит из файла данных. Я хочу использовать autoscale xy, так что сценарий GNUplot не нужно редактировать в зависимости от данных. Однако, когда я рисую, autoscale не устанавливает xrange таким же, как yrange. Это заставляет орбиты выглядеть «раздавленными».GNUplot Autoscale set xrange равно yrange

Я пробовал использовать set size square и set size ratio -1 How to set equal scale's length in gnuplot.

Но это не помогло.

Есть ли способ заставить autoscale сделать диапазоны x и y равными?

Спасибо!

ответ

5

Нет, нет возможности автомасштабирования x- и y-диапазона для тех же значений. Вот решение, как вы можете сделать это с некоторыми трюками.

Если вы хотите сохранить Gnuplot о продлении срока диапазонов до следующих тиков, вы можете сделать это следующим образом:

Вы должны сначала построить один раз, используя unknown терминал. Это сохраняет x- и y-диапазоны в переменных gnuplot GPVAL_X_MIN, GPVAL_X_MAX, GPVAL_Y_MIN и GPVAL_Y_MAX. Затем вы устанавливаете диапазоны и 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 

Толчок/поп-материал необходим только если вы хотите сохранить первоначальные настройки терминала.

Чтобы сделать это многоразовым, например, для использования с multiplot, вы можете обернуть все эти команды внутри строки и вызвать eval на нем:

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 
} 

Другим вариантом было бы использовать stats для вычисления максимального и минимального х- и у-значения и установить диапазоны соответственно:

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

Спасибо за решение. Однако этот метод довольно расстраивает, поскольку я использую 'multipot' для построения 4 графиков из разных столбцов в файле данных. необходимость сделать это для каждого набора данных не идеальна, но работоспособна. – Rohan

+0

Да, действительно. Я обновил свой ответ, чтобы показать вам, как вы можете поместить все это в строку и использовать 'eval', чтобы сделать его многоразовым. – Christoph

Смежные вопросы