Построение графика при помощи утилиты gnuplot

Gnuplot — свободная и кроссплатформенная утилита

для визуализации научных (и не только) данных

Gnuplot — это свободный инструмент для создания графиков. Поддерживается создание как двухмерных, так и трехмерных изображений.

Программа доступна для множества платформ — Linux, MS Windows, OSX и представляет собой утилиту командной строки, с собственным набором команд. Так же имеется возможность выполнять скрипты. Поддерживается вывод как непосредственно на экран, так и в файлы различных графических форматов.

Утилита очень удобна для визуализации и глубокого анализа различных научных данных. Встроенный скриптовый язык позволяет гибко задавать различные параметры визуализации.

Официальный сайт проекта - http://www.gnuplot.info/

Распространяется как в виде исходных кодов, так и в виде уже собранных пакетов и установочных файлов для различных операционных систем. В случае большинства дистрибутивов Linux программа доступна в репозиториях и устанавливается штатными средствами дистрибутива. Для Apple OSX установка доступна, например, через macports (см. http://www.macports.org/)

 

В сети и в частности на официальном сайте доступны множество примеров использования gnuplot, русскоязычной же информации увы крайне мало.

В этой статье я рассмотрю несколько типовых примеров использования gnuplot в формате «подставил свои данные — получил график».

 

Для начала рассмотрим основные команды, которые будут актуальны практически каждый раз. Важный момент — все команды регистрозависимые, так что команда help будет понята утилитой, а вот Help — уже нет.

  • help — собственно помощь, богатая встроенная интерактивная справка, можно получать справку по конкретной команде, например help plot

  • set xlabel «моя подпись для x» - задает подпись для оси абсцисс

  • set ylabel «моя подпись для y» - задает подпись для оси ординат

  • set xrange [min:max] — задает лимиты значений для оси абсцисс, после выполнения команды ось на графике будет размечена от min до max, значения графика не попавшие в этот диапазон будут отброшены. Этот параметр может быть полезен для фильтрации ненужных значений или же для визуального отодвигания начала и конца графика от краев изображения. В качестве min, max могут быть целочисленные значения, числа с плавающей запятой, а так же даты.

Если вместо конкретного значения указать * - значение будет вычисляться автоматически, на основе минимального/максимального значения в данных.

По умолчанию gnuplot использует режим [*:*] с автоматическим вычислением.

  • set yrange [min:max] — аналогично xrange, только для оси ординат.

  • plot — собственно команда построения графика, эта команда принимает обязательный аргумент — источник данных для построения графика, это может быть имя файла с исходными данными, либо же математическая формула.

Есть возможность, через запятую, задать несколько источников данных — тогда на одном «полотне» будут нарисованы несколько графиков, так же можно указывать дополнительные параметры — тип графика, параметры отрисовки. Об этом в примерах ниже.

  • set terminal <term_type> - служебная команда, задает механизм вывода графика, по умолчанию вывод выполняется на экран (если доступна графическая оболочка), для переключения в режим записи в png файл следует выполнить команду set terminal png для возвращения в режим отображения на экране следует выполнить эту команду с иным аргументом:

          • Для Windows: set terminal windows

          • Для Linux: set terminal X11

          • Для OSX: set terminal aqua

Полный список доступных терминалов можно узнать, если просто выполнить команду set terminal

  • set output «filename.png» - задает имя выходоного файла, в случае если выбран соответствующий режим в set terminal

  • set key <param> - эта команда, вместе с различными параметрами позволяет управлять «легендой» графика, наиболее используемые варианты применения:

          • set nokey — выключить отображение легенды

          • set key — включить ранее выключенное отображение легенды

          • set key title «подпись» - задает произвольную подпись к легенде

          • set key {left | right | center} {top | bottom | center} — комбинацией параметров можно задать расположение легенды

  • reset — сброс всех заданных параметров

Теперь настало время примеров, построим простейший график функции sin(x), установив легенду с произвольным текстом и расположением. Так же зададим ограничения значений по X

Запускаем gnuplot и вводим следующие команды (где > - приглашение командной строки gnuplot)

> set xrange [-2:5]

> set key horizontal top left

> set key title "график функции sin(x)"

> plot sin(x)

 

После выполнения последней команды откроется окно с нарисованным графиком

 

Теперь рассмотрим более реальный пример — например зависимость уровня радиации от высоты.

 

У нас есть исходные данные — высота в метрах и уровень радиации в микрозивертах.

Сохраним эти данные в текстовый файл, в виде двух колонок (обязательное условие — разделителем дробной части должны быть точки)

 

220 0.1

500 0.1

1000 0.1

1500 0.1

2000 0.1

2500 0.11

3000 0.12

3500 0.13

4000 0.14

4500 0.18

5000 0.2

5500 0.22

6000 0.25

6500 0.29

 

Где в первой колонке — высота, это будут значения для X, а во второй колонке — микрозиверты, значения для Y.

Сохраним эти данные в некий тектовый файл radiation.txt

Теперь в текущем каталоге (где сохранен файл с данными) запускаем gnuplot и вводим следующие команды:

 

> set xrange [100:7000]

> set ylabel "Уровень радиации"

> set xlabel "Высота"

> plot «radiation.txt» with lines

 

В итоге на экране мы получим график

 

В последней команде мы «попросили» gnuplot построить график по данным из файла radiation.txt, так же было дополнительно указана опция with lines что означает использовать сплошную кривую для отрисовки графика.

 

Еще возможные варианты команды позволяют нарисовать графики вида:

> plot "radiation.txt" with points

 

> plot "radiation.txt" with boxes

 

Для варианта with points можно так же задать дополнительные параметры — тип точек, делается это с помощью дополнительного аргумента pointtype <num>, где num — некое целое число, означающее тип точки. Попробуйте самостоятельно поиграть с этим значением и посмотреть какой тип точки будет нарисован, вот некоторые примеры:

> plot "radiation.txt" with points pointtype 5

 

> plot "radiation.txt" with points pointtype 6

 

Рассмотрим другую распространенную ситуацию — есть несколько наборов данных и необходимо нарисовать несколько графиков сразу, для удобного визуального сравнения.

Сделать это очень просто. Подготовим еще один набор данных и сохраним его в файл radiation2.txt

 

120 0.1

500 0.11

1000 0.12

1500 0.12

2000 0.12

2500 0.13

3000 0.14

3500 0.16

4000 0.17

4500 0.19

5000 0.21

5500 0.25

6000 0.32

6500 0.46

Запускаем gnuplot и выполняем уже знакомую последовательность команд:

> set xrange [100:7000]

> set ylabel "Уровень радиации"

> set xlabel "Высота"

 

А теперь просим программу построить сразу два графика, еще и задав произвольные заголовки для легенд, делается это сразу одной строчкой

> plot "radiation.txt" with lines title "Радиация 1", "radiation2.txt" with lines title "Радиация 2"

В итоге получим график

 

Очень просто. Количество наборов данных может быть произвольным — просто указываются через запятую, как в данном случае.

Теперь построим точно такой же график, но вместо вывода на экран сразу сохраним в png файл:

> set xrange [100:7000]

> set ylabel "Уровень радиации"

> set xlabel "Высота"

> set terminal png

> set output «plot.png»

> plot "radiation.txt" with lines title "Радиация 1", "radiation2.txt" with lines title "Радиация 2"

После выполнения команды в текущем каталоге появится файл plot.png с изображением графика. Как видно данная операция отличается вводом двух дополнительных команд, описанных в начале настоящей статьи.

 

А теперь для примера рассмотрим принципы построения трехмерных графиков.

Для построения объемного графика нам нужна третья координата — Z, подготовим текстовый файл 3d.txt с таким набором данных

 

9.862e-01 -8.062e-02 0.001

9.786e-01 -1.134e-01 0.002

9.720e-01 -1.382e-01 0.003

-1.849e-01 -2.165e-01 80.000

-2.412e-01 -1.301e-01 90.000

-2.611e-01 -4.825e-02 100.000

 

Далее выполняем команды gnuplot:

 

> set xrange [-1:1]

> set yrange [-1:1]

> splot "3d.txt" with lines

 

Внимательный читатель сразу заметит, что вместо plot мы используем команду splot, именно она позволяет создать трехмерный график, корректно обрабатывая данные. Если же использовать старую команду plot — будет построена некая двухмерная проекция предполагаемого графика.

 

После выполнения команды мы получим вот такое симпатичное изображение:

 

Исходных данных у нас не очень много, поэтому изображение выглядит не так впечатляюще, как могло бы выглядеть, но тем не менее мы можем попробовать отобразить эти данные в виде трехмерной поверхности, для этого добавим новую команду:

 

> set dgrid3d 30,30

 

Команда создает трехмерную сетку размером 30 на 30, наши же данные будут вытянутыми вершинами в этой сетке, генерация графика осуществляется как и в примере выше, в итоге получаем изображение:

 

Познакомиться более глубоко с принципами построения трехмерных графиков можно тут: http://gnuplot.sourceforge.net/demo/surface1.html

Приведено достаточно много примеров на все случаи жизни.

Еще больше захватывающих примеров: http://gnuplot.sourceforge.net/demo/

 

Более подробную информацию можно почерпнуть в официальной документации.

Так же не забывайте про команду help.

Успехов!

 

P.S. Построение графиков может пригодиться Вам при астрометрии звезд или астероидов и при поиске новых переменных звезд.

 

Кутков О.Е., КрАО

2015г

Астробиблиотека

 

Комментарии

Отправить комментарий

Ваш email не публикуется. Нужен, для возможности связи с вами, администратору сайта.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и параграфы переносятся автоматически.

Подробнее о форматировании

Защита от спама (captcha)
This question is for testing whether you are a human visitor and to prevent automated spam submissions.
4 + 1 =
Решите эту простую математическую задачу и введите результат. То есть для 1+3, введите 4.