Date Редакция Категория sci Теги gnuplot / графика

cover_seashell.png

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

Графики функций в параметрическом представлении, то есть функций, заданных не обычным уравнением

{

$$y=f(x),$$

}

а двумя уравнениями вида

{

$$x=x(t),$$

} {

$$y=y(t),$$

}

строятся с указанием настройки parametric:

set parametric
set trange [0:2*pi]         # диапазон изменения параметра
x(t) = (1-sin(t))*cos(t)**3
y(t) = (1.0/3.0)*(1-sin(t))*sin(t)-(1.0/3.0)*sin(t)**2
plot x(t),y(t) with filledcurves

with filledcurves закрашивает внутренность кривой. Получается кардиоида (рис. 1):

Рис. 1

Аналогично, указав polar, можно получить график в полярных координатах (рис. 2):

set polar
set samples 1000
set trange [-pi:pi]
unset raxis
unset rtics
plot (1+sin(t))*(1-0.9*abs(sin(4*t)))*(0.9+0.05*cos(200*t))\
     with filledcurve linecolor 2;

Если команда set устанавливает настройку, то unset ее отменяет. В данном случае мы не стали рисовать полярную ось и отметки на ней (попробуйте закомментировать unset-ы и посмотрите что получится). samples указывает, сколько точек нужно взять для представления графика (помните isosamples из первой части?). ‘\’ позволяет продолжить запись команды в следующей строке.

Рис. 2

gnuplot позволяет также строить гистограммы, круговые и столбчатые диаграммы, графики функций, заданных неявно… И вообще — сложно представить себе то, чего gnuplot не мог бы построить. Но мы переходим к манипуляциям с данными. Помните, как Excel применяет функции к столбцам и строкам таблицы? gnuplot делает нечто подобное.

Манипуляции с данными покажем на примере файла:

# data2.txt
# x y z
1 16.0 40
2 15.5 30
3 15.8 35
4 16.1 38
5 14.6 39
6 14.5 40
7 13.0 38
8 10.0 39
9 12.3 39
10 11.2 37

Можно построить график по первым двум колонкам (рис. 3)

plot "data.txt" using 1:2 with lines
using 1:2  используются данные из колонок с номерами 1 и 2.

Рис. 3

Можно также построить график по первой и третьей колонкам и подсчитать разность между графиками (рис. 4):

plot "data.txt" using 1:2 with lines,\
     "" using 1:3 with lines,\
     "" using 1:($3-$2) with lines

Рис. 4

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

Вам знаком тернарный условный оператор (a ? b : c) из языка С? Работает он и в gnuplot: если условие a истинно, то выполняется операция b, если нет — то операция c. Допустим, мы хотим построить график по первым двум колонкам данных. Но если значение в 3-ей колонке будет больше 39 (как в 1-й и 6 строках), то вместо числа из 2-ой колонки будем брать ноль. Вот как это выглядит:

plot "data.txt" using 1:(($3 > 39) ? 0 : $2) with lines

Результат показан на рис. 5.

Рис. 5

«Но ведь это все — операции с колонками. А как насчет строк?», — скажет внимательный читатель. И будет прав. Возьмем данные из каждой (every) второй строки:

plot "data.txt" using 1:2 every ::2

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

Анимация создается по заданным функциям и по файлам данных. В последнем случае данные, составляющие кадр анимации, должны отделяться от данных другого кадра двумя пустыми строками. Посмотрим (рис. 6), как строится анимация по данным из файла projectile.dat (сам файл можно скачать здесь):

set terminal gif animate delay 100
set output "projectile.gif"
set yrange [0:3]
set xrange [0:12]
do for [i=0:29] {
    plot "projectile.dat" index i  u 1:2 w p lt 7 lc rgb "black" ps 3
}

Данные выводятся в формат GIF (set terminal gif) с интервалом между кадрами (delay) 100 мс. do for [i=0:29] {...} — цикл по кадрам анимации. Обращение к каждому кадру происходит по его номеру — index i. С сокращениями, рисующими черные кружочки, вы, надеюсь, разберетесь сами.

Рис. 6

Аппроксимация позволяет получить уравнение кривой, наилучшим образом соответствующей точкам данных. Рассмотрим данные из файла projectile.dat (рис. 7).

Рис. 7

и найдем кривую, описывающую эти данные. Больше всего она напоминает параболу

f(x) = a + b*x + c*x**2

Зададим ее в командной строке и скомандуем gnuplot найти коэффициенты a,b и c:

fit f(x) 'projectile.dat' via a,b,c

У меня они получились следующими:

a = 1.71135e-006
b = 0.999998
c = -0.0980998

Можете проверить их значения, набрав, например: print a

А теперь посмотрим, насколько хорошо у нас вышла аппроксимация:

plot 'projectile.dat' u 1:2 w p lt 7 ps 3,\
     f(x)

Рис. 8

Калькулятор и библиотека. gnuplot обладает полноценным языком программирования, в котором есть структуры данных (например, комплексные числа), условные операторы (тернарный и обычный if-else), циклы (do for и while), файловый ввод и вывод, возможность сохранять скрипты и подгружать внешние библиотеки. Это позволяет использовать gnuplot в качестве калькулятора, когда возможностей встроенного калькулятора уже не хватает, а устанавливать математического «монстра», вроде MATLAB, не хочется. Да и к тому же gnuplot совершенно бесплатен.

Кстати, использовавшийся нами файл projectile.dat рассчитан и записан с помощью gnuplot:

# движение тела, брошенного под углом к горизонту
set parametric
set samples 30

alpha = 45 * pi/180
v0 = 10
g = 9.81

set trange [0:2*v0*sin(alpha)/g]

x(t) = v0*cos(alpha)*t
y(t) = v0*sin(alpha)*t - g*t**2/2

set table "projectile.dat"
plot x(t),y(t)
unset table

Еще чаще, чем в роли калькулятора, gnuplot используется как библиотека для построения графиков в различных языках программирования и пакетах, у которых нет «родных» средств визуализации.

Когда команд не хватает. С помощью команд удобно рисовать множество графиков по одной стандартной схеме, но вот слегка подправить расположение легенды или какой-то другой мелочи на единственном графике — тут лучше подойдет графический интерфейс. Для gnuplot эта проблема решается с помощью Inkscape — свободного редактора векторной графики. Нужно лишь сохранить график из gnuplot в файл (SVG, EPS и т. п.), импортировать его в Inkscape, произвести там требуемую правку и экспортировать результат в нужный формат.

Что почитать. За рамками нашего рассказа осталось еще множество возможностей gnuplot. Познакомится с ними, помимо официального руководства, можно в:

  • Phillips L. gnuplot Cookbook, Packt Publishing, 2012. — рецепты применения gnuplot на все случаи жизни. К книге прилагается исходный код.
  • Gnuplotting. Create scientific plots using gnuplot — по-настоящему продвинутые возможности программы.
  • Impossible gnuplot graphs — еще о нетривиальных возможностях gnuplot.
  • Fun math art — забавная математическая анимация, выполненная в gnuplot. Например, такая:

fig09_logarithmic_spiral.gif

Исходный код примеров можно скачать здесь.



Комментарии

comments powered by Disqus