В этой статье мы продолжим знакомство с gnuplot, начатое здесь.
Графики функций в параметрическом представлении, то есть функций, заданных не обычным уравнением
{
}
а двумя уравнениями вида
{
} {
}
строятся с указанием настройки 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):
Аналогично, указав 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
из первой части?). ‘\’
позволяет продолжить запись команды в следующей строке.
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.
Можно также построить график по первой и третьей колонкам и подсчитать разность между графиками (рис. 4):
plot "data.txt" using 1:2 with lines,\
"" using 1:3 with lines,\
"" using 1:($3-$2) with lines
Добавление $
к номеру колонки позволяет использовать последний в качестве переменной, выполнять с колонками математические операции и применять к ним функции.
Вам знаком тернарный условный оператор (a ? b : c)
из языка С? Работает он и в gnuplot: если условие a истинно, то выполняется операция b
, если нет — то операция c
. Допустим, мы хотим построить график по первым двум колонкам данных. Но если значение в 3-ей колонке будет больше 39 (как в 1-й и 6 строках), то вместо числа из 2-ой колонки будем брать ноль. Вот как это выглядит:
plot "data.txt" using 1:(($3 > 39) ? 0 : $2) with lines
Результат показан на рис. 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
. С сокращениями, рисующими черные кружочки, вы, надеюсь, разберетесь сами.
Аппроксимация позволяет получить уравнение кривой, наилучшим образом соответствующей точкам данных. Рассмотрим данные из файла projectile.dat
(рис. 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)
Калькулятор и библиотека. 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. Например, такая:
Исходный код примеров можно скачать здесь.
Комментарии
comments powered by Disqus