Нет, нет возможности автомасштабирования 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'
Спасибо за решение. Однако этот метод довольно расстраивает, поскольку я использую 'multipot' для построения 4 графиков из разных столбцов в файле данных. необходимость сделать это для каждого набора данных не идеальна, но работоспособна. – Rohan
Да, действительно. Я обновил свой ответ, чтобы показать вам, как вы можете поместить все это в строку и использовать 'eval', чтобы сделать его многоразовым. – Christoph