8/11/2006

Строим научные графики с помощью GNUplot

Задача: требуется строить научные графики, двухмерные и трёхмерные, с подписями на осях с греческими буквами - много и часто.
Решение: для этих целей давно и успешно применяется программа gnuplot, которую мы быстро поставим и освоим в Linux.


Введение
Стереотипы, вредные привычки и топорные, неэффективные решения чрезвычайно живучи. Одним из таких топорных решений является применение офисных средств при работе с научными документами. То, что это легко осваивается, вовсе не значит, что это будет удобно и просто. Сколько времени и сил у научных сотрудников уходит в песок - совершенно напрасно и бесцельно. Для того, чтобы эффективно работать в научной среде, необходимо дать себе за труд освоить соответствующие инструменты. Одним из них является LaTeX, другим -
gnuplot. О нём и пойдёт речь дальше.


Немного о gnuplot
Сначала его поставим - как всегда:
#apt-get install gnuplot
Если его теперь запустить, вызвав в консольке
$gnuplot
то он нас поприветствует примерно таким образом:

G N U P L O T
Version 4.0 patchlevel 0
last modified Thu Apr 15 14:44:22 CEST 2004
System: Linux 2.6.15.7

Copyright (C) 1986 - 1993, 1998, 2004
Thomas Williams, Colin Kelley and many others

This is gnuplot version 4.0. Please refer to the documentation
for command syntax changes. The old syntax will be accepted
throughout the 4.0 series, but all save files use the new syntax.

Type `help` to access the on-line reference manual.
The gnuplot FAQ is available from
http://www.gnuplot.info/faq/

Send comments and requests for help to

Send bugs, suggestions and mods to


Terminal type set to 'x11'
gnuplot>

То есть запустилась интерактивная часть программы. Здесь нам предлагают набирать команды и сразу видеть их результат - что не очень удобно, особенно если вы в первый раз работаете с
gnuplot.

Но у
gnuplot есть и другой режим работы - потоковый. На мой взгляд, для освоения и работы он более эффективен. Для того, чтобы быстро начать с ним работу и сразу посмотреть, на что он способен, мы построим небольшой, но показательный график. Всё, что нам потребуется - это ваш любимый текстовый редактор с подсветкой синтаксиса и немного терпения.

Приступим
В потоковом режиме работы
gnuplot воспринимает сразу все команды, которые вы ему пошлёте, и сразу строит график по данным из файла. В ряде случае это удобнее, а если требуется строить множество графиков, то потоковый режим работы GNUplot вас просто спасёт.

Итак, ниже я привожу разбор построения типичного графика, параметры которого записанного в виде скрипта, что выделено тёмно-красным цветом, а комментарии серым цветом. Пишите в файл строчки так, как они написаны здесь, без переносов и абзацев - это важно!

Создаём новый файл, называем, например, simple.graph и начинаем в него записывать команды
gnuplot. Признаком того, что файл относится к скрипту GNuplot, является первая строка в файле:
#! /usr/bin/gnuplot -persist
Далее выведем график в виде файла формата постскрипт (который можно скормить LaTeX)
set terminal postscript eps enhanced
задаётся имя выводимого файла с графиком, имя в кавычках
set output "~/RMSresearch.ps"
Ставим поддержку кириллицы, а то не увидим в подписях
set encoding koi8r
Устанавливаем метки по осям, размер и тип шрифта: сейчас по оси Х
set xlabel "Параметр регуляризациии {/Symbol a}, 10^{-n}" font "Helvetica,18"
Устанавливаем метки по осям, размер и тип шрифта: теперь по оси Y
set ylabel "Величина СКО, отн.ед" font "Helvetica,18"
Устанавливаем предел значений по оси Y
set yrange [0:1]
Задаём стиль линии (line1): сплошная прямая(lt - от linetype) с круглыми точками (pt - от pointstyle) типа 7
set style line 1 lt 1 pt 7
Теперь, задав все параметры, строим график, беря данные из файла RMSresult (для примера), где мы берём только второй столбец. Легенду для данных второго столбца называем СКО (среднеквадратичное отклонение) и заставляем строить график, используя тип линии, который мы задали.
plot "~/RMSresult" using 2 title "СКО" with linespoints linestyle 1

Осталось привести содержимое файла RMSresult - это просто поток чисел, разделённых пробелами (снятые параметры физического эксперимента):

1.0000000e-04 6.1881100e-01
1.0000000e-03 5.5289577e-01
1.0000000e-02 3.5527980e-01
1.0000000e-01 2.4352333e-01
1.0000000e+00 2.5852181e-01
1.0000000e+01 2.5291911e-01
1.0000000e+02 2.5109706e-01
1.0000000e+03 2.5524945e-01
1.0000000e+04 2.6013621e-01
1.0000000e+05 2.4596297e-01


Теперь, когда у нас есть всё необходимое для строительства графика, в командной строке пишем:
$ cat simple.graph | gnuplot
Всё, должен появиться график RMSresearch.ps, который можно просмотреть любым графическим редактором. Выглядеть он должен примерно так:



Ну вот, мы и построили первый график в
gnuplot. Причём, график довольно навороченный - с греческими буквами в подписи, правильно подписанными осями и прочим. Теперь людей, работающих в UNIX-системах не первый день, должно замкнуть: раз он воспринимает команды потоково - значит, можно gnuplot завернуть в скрипт и заставить штамповать графики массово? Да, естественно! И я даже скоро приведу пример Perlового скрипта, который это делает. Таким образом мной было построено 96 графиков за 3 секунды. Это ещё один пример CLI Magick...

Ссылки:
Конечно, я не смог в одном посте охватить безбрежные возможности gnuplot, да и не ставил себе таких целей. Тем не менее, в блоге есть и другие статьи по gnuplot:

Создание графиков в gnuplot метки, оси и подписи
Создание графиков в gnuplot: о легендах
Создание графиков в gnuplot: деления на осях
Создание графиков в gnuplot: двухмерные графики
Создание графиков в gnuplot: оформление двухмерных графиков
Создание графиков в gnuplot: пример построения графика


Англоязычные ресурсы:

Самым информативным ресурсом по
gnuplot является домашняя страница одного японца, которая называется gnuplot tips (not so Frequently Asked Questions) с английским вариантом. Информации там море, достаточно хорошо структурирована и главное - море примеров. Далее есть Gnuplot FAQ, в котором информация больше идеологического плана. Интересная страница "Visualize your data with gnuplot" на сайте IBM, где приводятся несколько показательных примеров использования gnuplot.

Русские ресурсы:
Кое-что есть и в нашем отечестве. Статья "Примеры построения графиков" подойдёт для начального ознакомления, а статья "GnuPlot нарисует график" подойдёт для более глубокого ознакомления.

29 комментариев:

  1. Благодарю за наглядный и лаконичный пример. Интересно, что синтаксис, да и внешний вид графиков GNUPlot очень напоминает принцип "Handle Graphics Object Properties" MATLAB. А ведь известно, что MATLAB поддерживает элементарный уровень команд LaTeX в подписях и легендах. Похоже, в него частично интегрированы и возможности GNUPlot. Есть над чем задуматься.

    ОтветитьУдалить
  2. "Благодарю за наглядный и лаконичный пример."
    Всегда лучше что-то изучать на примерах. Так как возможностей у программы много, важно в них не запутаться. Чуть позже будет ещё несколько примеров, а потом постараюсь систематизировать основные параметры программы.

    "Похоже, в него частично интегрированы и возможности GNUPlot. Есть над чем задуматься."
    Использовать одну программу на все случаи жизни - это не unix-way и в большинстве случаев это не оправдано. Написанный скрипт и гнуплот можно использовать и для других целей, не запуская такой бронтозавр, как MATLAB.

    ОтветитьУдалить
  3. А можно увидеть ещё примеры работы с gnuplot? :)
    У меня есть такая задача: вывести решение уравнения теплопроводности при фиксированных 't', то есть график будет 2D. Но в каждый момент времени графиков должно быть три: при трёх t[i] - чтобы можно было видеть изменение решения. Я решил, что gnuplot вполне подходит для решения этой проблемы.

    ОтветитьУдалить
  4. 2 Igor
    А можно увидеть ещё примеры работы с gnuplot? :)
    В моём исполнении? Пока нет, т.к. сам его осваиваю. Но на странице того японца в ссылках - можно. У него много чего интересного.

    гнуплот подходит для массового строительства графиков, для постоянного изменения и пересчёта решения - не знаю...

    ОтветитьУдалить
  5. Спасибо автору!

    Статья толковая. Беру курс на отказ от Sigma Plot :)

    Единственно плохо, что вместо русского шрифта у меня крякозябли получились :(

    ОтветитьУдалить
  6. 2 Анонимный комментирует...
    Спасибо автору!
    Пожалуйста: комментаторам тоже спасибо, за ценные советы.

    Статья толковая. Беру курс на отказ от Sigma Plot :)
    В общем, это просто разбор конкретного примера. На ней я старался показать (и самому не забыть) базовые приёмы построения графиков в гнуплоте.

    Единственно плохо, что вместо русского шрифта у меня крякозябли получились :(
    Кодировку нужно назначить другую.

    ОтветитьУдалить
  7. Благодарю за хорошую статью, мне очень помогает! Но у меня есть ещё несколько вопросов о работе с русском языком в Gnuplotе в ОС Windows XP, может быть Вы меня ещё попожете. Я пользуюсь Gnuplot win32 4.22. Я попробовал KOI8r (тоже пользуюсь terminal Postscript) для поддержку кириллицы, но ничего не могу получить в графическом редакторе GSView 4.8(для посмотра и распечатки в Windows). Думаю может быть проблема с KOI8r(только для UNIX?). Хотел бы добавить character encoding CP1251, но опять не получилось(просто не знаю как добавить новый character encoding), поскольку существующие character encoding только: 'default', 'iso_8859_1', 'iso_8859_2', 'iso_8859_15', 'cp437', 'cp850', 'cp852', 'koi8r', 'koi8u' Помогите пожалуйста если сможете! Спасибо заранее!

    ОтветитьУдалить
  8. 2 svd пишет...

    Благодарю за хорошую статью, мне очень помогает!
    Пожалуйста.
    Кстати, скоро планирую опубликовать большую серию переводов примеров по Гнуплоту. Так что оставайтесь на нашей волне :-)

    Но у меня есть ещё несколько вопросов о работе с русском языком в Gnuplotе в ОС Windows XP
    Давно я в этой системе не работал :-)

    Я попробовал KOI8r (тоже пользуюсь terminal Postscript) для поддержку кириллицы, но ничего не могу получить в графическом редакторе GSView 4.8
    А вариант с конвертированием PS в TIF\PNG при помощи, скажем, ImageMagick не устраивает?

    поскольку существующие character encoding только: 'default', 'iso_8859_1', 'iso_8859_2', 'iso_8859_15', 'cp437', 'cp850', 'cp852', 'koi8r', 'koi8u'
    Мда, не густо с кодировками. Интересно, а как поклонники UTF8 это обходят!?
    Вариант с кодировкой default что даёт?

    ОтветитьУдалить
  9. Порылся в гугле - оказывается, он рулит :-) Вот что пишут в документации ко гнуплоту:

    "Pango, the library used to layout the text, is based on utf-8. Thus, the wxt terminal has to convert from
    your encoding to utf-8. The default input encoding is based on your ’locale’. If you want to use another
    encoding, make sure gnuplot knows which one you are using."

    Что означает, что если кодировку не указывать явно, будет локальная, т.е. ваша виндовая. Так что в моих примерах (и скриптах) это излишнее телодвижение. Вот такой багфикс получился. За что вам огромное спасибо!

    ОтветитьУдалить
  10. Спасибо! Вроде вижу надежду, но как это реализовать в MS Windows?Вроде terminal wxt только для UNIX!

    ОтветитьУдалить
  11. Наткнулся на ресурс о Gnuplot на русском. Возможно понадобится http://jarosh.by.ru/gnuplot/gnuplot_rus.html

    ОтветитьУдалить
  12. Можно спросить Вас (кто знает), как установить себе программу gnuplot, если Linux стоит Ubuntu, и под рутом зайти не удается, а сама программа скачана из интернета и на флэшке находится?

    ОтветитьУдалить
  13. С кодировками конечно те еще проблемы. в линуксе ладно, set terminal wxt
    set encoding default
    и при системной локали utf8 получаем русские буковки.
    Что делать в винде с кодировками непонятно честно говоря.
    Проводила эксперимент - сохраняла файлик в koi8r, потом делала
    set terminal x11
    set encoding koi8r
    всеравно отображает неправильно русские буковки.

    ОтветитьУдалить
  14. Проблему с локалью (utf-8, linux) я решил с помощью "костыля"

    enca -x koi8r < simple.graph | gnuplot

    ОтветитьУдалить
  15. Да какой же ч(м)удила, кроме президента РАН Осипова, надписи на рисунках (то, что вы называете англицизмм "легенды") на русском делает. У науки один язык - английский.

    ОтветитьУдалить
  16. @ Анна
    С кодировками конечно те еще проблемы.
    В Линуксе, что удивительно, уже нет. Только с виндой, но я по ней не шибко спец, даже проверить негде.

    @ Анонимный, 12.04.2010 22:54:00
    Да какой же ч(м)удила, кроме президента РАН Осипова, надписи на рисунках на русском делает. У науки один язык - английский.
    С этим я согласен полностью - хотя насчет президента РАН не в курсе. Меня просто заставляли это делать.

    Здесь, в Австралии, естественно, всё как надо, на английском. :-)

    ОтветитьУдалить
  17. Прочие применения графиков отменили? Есть техника. Вы Руководство по эксплуатации тоже на английском писать будете.
    Извините, англоязычное пижонство иногда достает.

    ОтветитьУдалить
  18. set term pdfcairo

    и нет никаких проблем с utf8

    ОтветитьУдалить
  19. Есть еще одна очень хорошая скриптовая программка - GLE (Graphics Layout Engine): http://glx.sourceforge.net/

    ОтветитьУдалить
  20. Привет. Есть простой файл из двух колонок. Первая - кол-во точек, вторая - время в миллисекундах.

    Требуется построить график зависимости времени от кол-ва точек... И хотелось бы время не в миллисекундах, а в секундах, или часах/минутах... можно ли это сделать не изменяя исходный файл? на лету? просто поделить кол-во миллисекунд на 1000 как-нибудь?

    Спасибо.

    ОтветитьУдалить
  21. @Анонимный комментирует...
    Вы Руководство по эксплуатации тоже на английском писать будете.
    Буду, если техника продаётся\используется везде, а не только в русскоговорящих странах. Контекст комментария выше был иной: язык науки - английский, а то, что некто Осипов об этом не знает - проблемы тов. Осипова. Никто русский учить не будет.

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

    @Denis комментирует...
    set term pdfcairo
    Так вы получите графики в PDF, а часто нужно в EPS.


    @Дмитрий комментирует...
    Есть еще одна очень хорошая скриптовая программка - GLE (Graphics Layout Engine)
    Занятно. Спасибо, посмотрим.

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


    @FancyWriter комментирует...
    Требуется построить график зависимости времени от кол-ва точек... И хотелось бы время не в миллисекундах, а в секундах

    Запросто:

    plot "data.file" using 1:($2*100)

    Так вы на лету увеличите значения второго столбца в сто раз. Не забудьте поправить

    set yrange [min:max]

    чтобы данные отображались в новом масштабе.

    ОтветитьУдалить
  22. > plot "data.file" using 1:($2*100)

    Спасибо, действительно помогло. :)

    Я на самом деле ступил... вычитал про это то ли в мануалах, то ли в интернетах.. но упорно делил на 1000 1-ю координату, а мне надо было вторую!.. вот... почему-то так.

    ОтветитьУдалить
  23. Помогите, пожалуйста! В текстовом файле есть несколько столбцов.Мне необходимо построить зависимость первого столбца от второго. Как это сделать?

    ОтветитьУдалить
  24. В копилку

    http://www.osc.phys.msu.ru/mediawiki/upload/Khalili/gnuplot1.pdf

    http://www.osc.phys.msu.ru/mediawiki/upload/Khalili/gnuplot2.pdf

    ОтветитьУдалить
  25. скажите, пожалуйста, как в gnuplot сделать русские подписи к рисункам. В терминале gnuplot в Ubuntu русские буквы не печатаются.
    Спасибо за внимание.

    ОтветитьУдалить
  26. Есть ли возможность установки гнуплота на мак?

    ОтветитьУдалить
  27. @Анонимный комментирует...
    14 дек. 2014 г., 11:01:00

    > Есть ли возможность установки гнуплота на мак?


    Анонимус, ты явно не первый, кто задался этим вопросом :-)

    Автор, подумывающий свалить с ёпенсорца на мак, тоже этим вопросом задался. В общем, ответ: да, можно, но процесс установки напоминает ректальное удаление гланд бензопилой.

    Я не пробовал (в смысле гнуплота на мак, а не гланды бензопилой :-)), но в комментах к посту выше народ говорит, что MacPorts в этом плане стали лучше.

    ОтветитьУдалить