Журнал LinuxFormat - перейти на главную

LXF122:Gnuplot

Материал из Linuxformat
Перейти к: навигация, поиск

Содержание

Gnuplot

Gnuplot – это больше, чем просто плоттер: он способен даже рисовать графики, пока вы спите. Марко Фиоретти изучает его возможности.

Возможно, вы никогда не слышали о Gnuplot раньше, но это не значит, что программа плохая. В действительности, Gnuplot — очень удобная утилита, используемая для преобразования любой функции или набора числовых данных в простые диаграммы или графики. Она работает под Mac OS X, Windows и Linux, причем из командной строки — автоматически или интерактивно.

Понять, как строятся графики в Gnuplot, несложно, но стоит ли трудиться? Зачем отходить от Gnumeric или OpenOffice.org Calc? Преимущество Gnuplot заключается не в построении красивой диаграммы, а в том, чтобы помочь вам понять скрытое правило, прячущееся за набором чисел. В таком случае вам нужна не внешняя привлекательность, а возможность быстрого эксперимента, чтобы «распознать поведение» ваших данных, считает Филипп Жанер [Philipp Janert], автор книги Gnuplot в действии (Gnuplot in Action).

Gnuplot — прекрасный выбор для подобных задач графического анализа. Его командная строка обеспечит эффективное проведение быстрых интерактивных экспериментов с данными любого сорта, от демографических тенденций до 3D-моделей. Посмотрите некоторые из примеров работы с 3D на http://t-kita.net/gnuplot_povrml.

LXF122 37 1.jpg Кто здесь самый неуспевающий студент? Кто засачковал с середины года? Gnuplot и файловый менеджер мигом ответят на эти вопросы.

Графический анализ можно выполнять даже параллельно. Представьте, что у вас есть 50 различных файлов с данными, в каждом из которых – перечень оценок, полученных студентом за год. Как быстро установить, у кого наихудшая успеваемость? Просто велите Gnuplot создать по диаграмме на студента, и вы тут же получите ответ. Посмотрите на снимок экрана, и вы сразу же увидите, что главный лодырь – Студент 8. Можно также отметить, что со Студентом 4 случилось что-то плохое посреди года, когда его оценки значительно ухудшились.

Кроме возможностей графического анализа, Gnuplot имеет массу функций, для физиков и лириков. Программу можно полностью автоматизировать, она не требует много ресурсов и может работать на сервере без графической оболочки – полезно, например, при создании графиков для интернет-страниц. Необходимые файлы данных и команды представляют собой простой текст ASCII, а графики на выходе можно экспортировать в любой формат, например, PNG, GIF, PostScript или для LaTeX.

Поскольку данные и команды находятся в формате ASCII, их производство легко взвалить на компьютер. Вы можете использовать Gnuplot в сценариях для генерации и вставки диаграмм в файлы OpenDocument (подробнее об автоматизации дальше).

Окно терминала Gnuplot

Если вы наберете gnuplot, первое, что вы увидите, после юридических и справочных примечаний, будет строка вроде этой:

Terminal type set to _ЧТО-ТО_

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

Говоря об оконных терминалах, давайте сразу пресечем обычную среди новичков Gnuplot путаницу. Если вы передадите в Gnuplot файл с командами, а терминалом является окно, оно появится и тут же исчезнет, потому что Gnuplot закрывает его после выполнения последней команды в файле. Такого исхода можно избежать, если поместить в конце файла инструкцию pause-1 или добавить опцию -persist в командной строке. В первом случае окно останется открытым, пока вы не нажмете Enter. Во втором – вам потребуется закрыть его мышью.

Выбор формата для конечного файла зависит от того, в какой документ пойдет диаграмма и какие красоты в нем необходимы. Если вам требуется изобилие шрифтов, лучшим выбором будут терминалы PostScript или LaTeX. В последнем случае – если тип терминала установлен в epslatexGnuplot не просто сгенерирует EPS-файл: вы еще получите код TeX, подключаемый к основному LaTeX-документу для вывода всего текста, присутствующего на графике. Форматы типа PNG больше подходят для диаграмм, предназначенных для вставки в презентации или web-страницы.

Основные переменные и команды

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

# marco -> gnuplot <файл_с_командами>

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

set terminal <тип_терминала> size 1600, 1200
set size 0.5, 1.5

Команда для задания значения – set, a size определяет размер холста. По умолчанию, диаграмма заполняет холст встык с границами, если вы не задали для нее другой размер. Первая строка в примере выше определяет область 1600 × 1200 пикселей, вторая означает, что наша диаграмма будет наполовину меньше ширины холста, но в полтора раза больше в высоту. Для сохранения этих или любых других настроек в файле конфигурации, наберите

gnuplot> save set “settings.gnu” 

а для его загрузки с целью повторного использования –

gnuplot> load “settings.gnu”

Итак, мы указали формат среды диаграммы; теперь нам нужно, чтобы отображение было наглядным. Это можно сделать благодаря второй группе команд – они позволяют задать цвет каждому элементу диаграммы, название и подписи осям. Цвета определяются числовыми кодами: 1 – красный, 2 – зеленый, и так далее. Полный список цветовых значений находится в разделе справки Styles; отметим только, что определенный цвет присваивается линии заданием кода цвета в ее параметре linecolor.

Добавление надписей к линиям немного проще: все, что требуется сделать – это ввести нижеследующее после всех прочих опций, описывающих, как построить кривую или поверхность (примеры – см. далее):

title “<заголовок графика>”

Вы также можете добавить заголовок всей диаграмме, набрав

set title “I am the main title”

А вот инструкции для задания подписей и отметок на осях:

set xlabel “Hello, I’m the name of the horizontal Axis”
set ylabel “I define the vertical Axis instead”
set xtics 1.5,0.5,3
set ytics -1,1.0,4

Наконец, построение!

LXF122 38 1.jpg Одну и ту же функцию можно вывести массой способов: изменить цвет, маркер и тип линии на графике очень легко.

Наконец, существуют команды, которые сообщают Gnuplot, что строить и как это делать, от простых кривых или наборов точек до сложных многоцветных 3D-поверхностей. Помните, что вы можете изображать функции, данные или все вместе. Построение функций выполняется просто, а самые популярные, вроде sin(x), встроены в Gnuplot. Универсальные команды для интерполяции и аппроксимации данных доступны через smooth, а команда fit и ее опции позаботятся о подгонке по методу наименьших квадратов. При этом вы можете быстро задавать собственные функции, с константами или без, используя стандартную форму математической записи:

gnuplot> a=5
gnuplot> b=7
gnuplot> f(x)=a*(x**2 + b*x)

Определив функцию, вы можете даже вычислить ее значение для заданного аргумента х, скажем, 3.025, набрав в Gnuplot следующее:

print f(3.025)

Стиль графиков задается через ключевое слово with. Поскольку Gnuplot позволяет использовать кратчайшее однозначное усечение ключевого слова, нередко встречаются команды следующего формата:

plot sin(x) w i
plot sin(x) w p

LXF122 38 2.jpg Наложение графиков разных функций — скорейший способ их сравнения.

Они, соответственно, означают построение функции sin(x) в виде серии импульсов либо точек. Экранный снимок два графика рядом. Если вы хотите построить две и более кривых на одном холсте, просто укажите подряд соответствующие функции или файлы с данными и всеми необходимыми опциями, разделяя кривые запятыми:

plot sin(x) with impulses, cos(x) with lines

От простого к сложному

Команда plot очень многофункциональна. Мы затронули только основные доступные действия, но если вы хотите прорваться в третье измерение при построении вашей функции, вам нужна команда splot (surface plot):

splot [-0.005:0.005][-0.02:0.02][:] (100*(x + y))/(tan(x + y)**2) title ‘LXF 3D function example’ with lines

LXF122 38 3.jpg Gnuplot использует команды plot и splot для построения простых графиков и 3D-диаграмм, соответственно.

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

Кроме линий и точек, Gnuplot умеет строить цветные контурные карты, которые будут выглядеть как топографическое изображение высот, если задать правильный режим с помощью стиля set pm3d.

И это еще не все, на что способен Gnuplot. Обычно 2D-функции задаются в форме y=f(x), где y зависит от x. Gnuplot также поддерживает и параметрическое задание функции, если указать соответствующий режим, и работает с 3D-графиками. Для примера выполните следующие три команды:

set parametric
plot sin(t),t**2 title ‘Parametric example’ with linespoints
splot sin(u + v),v + 2, v-u title ‘LXF 3D Parametric example’ with linespoints

Условное построение

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

gnuplot> plot x>0 ? exp(-x) : exp(4*x)

Эта команда построит y=exp(-x) для x>0 и y=exp(4*x) для x<=0. Таким же образом можно нарисовать и отдельный сегмент заданной функции.

Gnuplot также может строить произвольные кривые по данным в файлах. Имеются в виду простые файлы ASCII, где числа указаны по столбцам, разделенным пробелами или знаками табуляции. Gnuplot может использовать числовые значения как есть или передавать их в качестве аргументов функции. Столбцы в файлах данных ассоциируются со специальными переменными $1, $2 и так далее:

plot “mydata.dat” using 3:(2*($6*$8)) with lines lw 10 title
“Plot from 1st file”, “mydata2.dat” using 3:(50 +30*sin($12 + $10)) with lines lw 10 title “Plot from 2nd file”

LXF122 39 1.jpg Неважно, из скольких источников поступили ваши данные — их можно смешивать, обрабатывать и сравнивать без проблем

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

А если никаких функций нет, и вам интересна только часть данных в файле (через строку, например)? Для этого тоже имеется ключевое слово: every.

every 2x
every ::N::Q

Первая команда строит каждую вторую строчку, вторая – только строки с номерами от N до Q. Если надо пропустить несколько строк в произвольном порядке, просто добавьте впереди них ? в качестве первого символа.

А как с датами?

Если в вашем файле есть столбец, который вы хотите использовать в качестве оси, а он состоит из дат или времени, Gnuplot не подведет и тут. Укажите несколько настроек:

2004-02-09 310
2004-02-10 185
2004-02-11 239
2004-02-12 132
2004-02-13 85
2004-02-14 57
2004-02-15 8

Чтобы Gnuplot распознавал строки в первом столбце как даты, задайте его формат посредством двух переменных:

gnuplot> set xdata time
gnuplot> set timefmt “%Y-%m-%d”
gnuplot> plot “time_example.dat” using 1:2 with lines lw 8 title “Plotting time-dependant values”

LXF122 39 2.jpg Если файл с данными содержит даты в любом формате, распознаваемым средствами С, Gnuplot создаст правильные подписи у должных осей.

Посмотрите на результат на графике на врезке, и отметьте, что риски на оси х были сгенерированы автоматически. Если значения времени представлены не в формате простых дат, а как квартальные временные ряды, вам потребуется пакет qplot по адресу http://ricardo.ecn.wfu.edu/~cottrell/qplot.

Gnuplot с другими программами

Gnuplot может выполнять команды или читать данные со стандартного потока ввода, как видно в этом примере:

# marco -> генератор_данных | gnuplot команды_gnuplot

Так же легко загрузить файлы данных, которые не существуют, но создаются на лету с помощью paste, cut, sed, awk или подобных утилит:

plot “< paste file1.dat file2.dat” using 1:2

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

1 #! /bin/bash
2 for FIL in `ls *.dat`
3 do
4 echo plotting $FIL
5 gnuplot <<ENDCAT
6 set terminal png
7 set output “$FIL.png”
8 plot [:][0:10] “$FIL” using 1:2 with lines
9 ENDCAT
10 done

Эти строки отправляют на стандартный ввод Gnuplot все находящееся между маркерами <<ENDCAT и ENDCAT. Все происходит в цикле, и при каждом изменении имени файла запуск этого скрипта сгенерирует столько графиков, сколько есть файлов DAT.

Пожалуйста, остановитесь на секунду, чтобы осознать, насколько это мощный инструмент. Даже если ваши данные сгенерированы на лету, вы можете добавить их после команды plot (“-” означает стандартный ввод), и Gnuplot загрузит все до первой строчки, начинающейся с ‘e’:

plot “-” using 1:2
# X Y
1 1.2
2 4.5
3 7
4 0.49
end

Захватывающе, верно? А теперь, почему бы не внедрить наши идеи и посмотреть, как можно еще применять Gnuplot?

Ресурсы

Кроме официальной документации, существует несколько онлайн-источников, которые помогут вам освоиться с Gnuplot после изучения описанных здесь основ. Встроенные функции Gnuplot описаны тут: http://theochem.ki.ku.dk/on_line_docs/gnuplot/gnuplot_toc.html, а ответы на Не Часто Задаваемые Вопросы ищите на http://t16web.lanl.gov/Kawano/gnuplot/indexe.html, там рассмотрены такие вещи, как использование в тексте букв греческого алфавита, цветные метки или использование команд Unix для предобработки файлов данных на лету.

Хороший учебник для продвинутых пользователей находится по адресу http://mathewpeet.org/computing/gnuplot. Полезные советы для Gnuplot в качестве инструмента построения графиков в OctaveLaTeX) есть на http://www.reimeika.ca/marco/prettyplots, а http://linuxgazette.net/126/peterson.html содержит детальное описание, как преобразовать уродливые файлы журналов Unix в элегантные диаграммы.

Если вы хотите использовать Gnuplot в качестве полигона для тестирования PovRay и других графических приложений, зайдите на http://www.digitalhermit.com/linux/ray_tracing/povray/mesh.

И наконец, почитайте Gnuplot в действии Филиппа Жанера издательства Manning Publications (http://www.manning.com/janert)

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

Помощь по Gnuplot

Кроме ресурсов, указанных выше, Gnuplot имеет встроенную систему справки, охватывающую все команды и ключевые слова, которые мы используем на нашем уроке. Наберите help для получения справки и прокрутите вниз: после краткого введения последует список разделов руководства. Наберите help название раздела, и получите всю информацию по нему. Также можно подписаться на список рассылки на вечно-популярном SourceForge (см. http://sourceforge.net/projects/gnuplot).

Персональные инструменты
купить
подписаться
Яндекс.Метрика