2012-06-29 4 views
9

Как ограничить автомасштабирование gnuplot, так что в качестве примера для y-max это, по крайней мере, определенное значение, и оно будет автоматически масштабироваться до фиксированного «предела»?Минимальные и максимальные границы Gnuplot для автомасштабирования

Просмотрев документацию, я вижу только, как фиксировать минимальное или максимальное значение оси, в то время как другое масштабируется автоматически.

About autoscaling on PDF page 93

+0

Не могли бы вы уточнить, что вы подразумеваете под автомасштабированием? Вы хотите установить значение ymax на определенное значение или вы хотите масштабировать данные, чтобы его максимум имел определенное значение? – andyras

+0

@andyras Пример для ymax: минимальный (ymax) может быть 100 и максимальный 1000. Если самая высокая точка данных равна 50, ymax будет 100. Он автоматически масштабируется для значений до 1000. После этого значения будет вырезано. – varesa

ответ

18

Начиная с версии 4.6 gnuplot предлагает новый синтаксис для указания верхних и нижних пределов автосканирования. В вашем случае вы можете использовать

set xrange [0:100 < * < 1000] 

Цитируя документации:

диапазон, в котором автомасштабирование выполняется, может быть ограничено нижней границей <lb> или верхняя граница <ub> или обоих. Синтаксис

{ <lb> < } * { < <ub> } 

Например

0 < * < 200 

<lb> = 0 наборы и <ub> = 200.

Этот синтаксис может применяться как к минимальному, так и к максимальному значению set *range.

Для AutoScale xmin но держать его положительное, используйте

set xrange [0<*:] 

Для AutoScale x но держать минимальный диапазон от 10 до 50:

set xrange [*<10:50<*] 

Смотрите документацию о set xrange для получения дополнительной информации.

4

Я не думаю, что это возможно, либо у вас есть автомасштабирование на нет-, мин- или максимизаторами, или обе оси т.е .:

set yrange [FIXED_MIN : FIXED_MAX] 
set yrange [  * : FIXED_MAX] 
set yrange [FIXED_MIN :   *] 
set yrange [  * :   ] 

соответственно.

+0

Так кажется, что это действительно так, скорее, что я не смог его найти. Кажется, мне нужно вручную масштабировать, используя данные – varesa

4

В этом случае, вы можете фильтровать данные, и пусть Gnuplot сделать это нормально автоматическое масштабирование:

set yrange [*:*] 
plot 'mydatafile' u 1:(($2 >= YMIN && $2 <= YMAX) ? $2 : 1/0) 
+0

Это в значительной степени то, что я сделал (но вне gnuplot). Извините, если я неправильно прочитал код, но это не учитывает значения ниже YMIN? Возможно, вы слегка неверно истолковали то, что я хотел (например, Ymin = 0, Ymax = 100-1000). Я решил это, добавив единую точку данных, причем цвет фона (поэтому он невидим) в YMIN. Это дало мне эффект, который я хотел. – varesa

+1

@varesa - Если вы используете gnuplot 4.6, есть также команда 'stats', которую вы могли бы связать с указанным выше фильтром и переменными, определенными gnuplot:' GPVAL_YMIN' и 'GPVAL_XMIN', но теперь мы начинаем немного усложни. «невидимая» точка - интересная идея, но мне она нравится. – mgilson

+0

@mgilson Gnuplot 4.6 добавил даже новый синтаксис для таких верхних и нижних пределов в автомасштабировании, например 'set xrange [0: 100 <* <1000]'. – Christoph

1

Так как люди, кажется, заинтересованы в этом вопросе, я добавлю, как я решил эту проблему, как ответ:

Я сделал минимум для автомасштабирования, вставив невидимый маркер в начале данных. Это заставляет сюжет всегда «показывать» его, хотя его и не видно.

Тогда я реализовал максимум за пределами Gnuplot (Propably могли бы возможно в нем, как хорошо, посмотрим на ответ mgilson в), в сценарии синтаксического анализатора, который я использовал для подготовки данных для Gnuplot.

Фактически в сценарии я взял все «вырезанные» значения, добавил их к y = 0 и сделал их красными. Таким образом, я получаю «предупреждение», значения слишком велики, чтобы быть разумным для графика. (Моя программа контролирует пинг между двумя хостами, и нет смысла пытаться графа 5s + latencies => Я отмечаю его как соединение сломанным)