Главная :: gnuplot :: Анимация в gnuplot
Программиста спрашивают: Скажите пожалуиста, который час? Программист: Который час, если вас это прикалывает девушка.

Анимация в gnuplot

Анимация позволяет наглядно показать динамику изменения данных и может быть использована, например, при подготовки презентаций. В данной статье рассматривается способ создания анимированного изображения (графика) в формате gif с помощью gnuplot.

Предупреждение. Для создания анимации указанным здесь способом необходима версия gnuplot 4.6 и выше с поддержкой библиотеки libgd.

В качестве терминала выбирается gif с опцией animate. Остальные параметры терминала устанавливаются по своим предпочтениям. Для примера выберем

set term gif \
    animate \
    optimize \
    delay 100 \
    size 300, 300 \
    background "#ffeedf" \
    crop \
    font "Times-Roman,10"

Здесь используется по умолчанию непрозрачный фон (для установки прозрачного фона используйте опцию transparent). Оптимизация изображения optimize позволяет, во-первых, использовать единую карту цветов для всех кадров и, во-вторых, значительно уменьшить размер файла за счет сохранения только изменившейся, по сравнению с предыдущим кадром, части изображения. Цвет фона указывается в виде background color, где цвет color задается в виде шестнадцатеричной палитры RGB (насыщенность красного, зеленного и синего цвета в диапазоне от 00 до ff в виде "#rrggbb"). Для уменьшения объема файла пустые пространства по краям можно обрезать crop (по умолчанию обрезка не осуществляется).

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

Опция delay n определяет время показа каждого кадра. Значение n указывается в 1/100 секундах. Дополнительно можно указать количество повторов n анимации loop n (если n=0, то количество повторов будет бесконечным - это значение по умолчанию). Опция size задает размер изображения в точках.

Теперь посмотрим как анимировать сам график, текст и произвольные объекты gnuplot.

Каждый кадр соответствует одному вызову функции рисования графика. В качестве примера мы используем функцию построения двухмерного графика plot. Для построения изолиний или трехмерных графиков используйте соответствующие функции. Количество кадров определяется циклом do for, функция построения графика должна находиться внутри этого цикла.

Для анимации текста используется функция форматирования строки sprintf, где подставляемые числовые значения определяются последовательностями %d для целых чисел и %f для вещественных.

При анимации объектов координаты записываются в виде формул, зависящих от переменной цикла. Обязательно указывается индекс объекта (в примере он равен 1) иначе вместо изменения текущего объекта будут создаваться новые.

Совет. Если не указывать индекс объекта, то на каждом кадре будут отображены положения объекта из предыдущих кадров. Таким образом можно показать траекторию движения объекта.

Суммируя вышеизложенное напишем скрипт анимации:

set term gif \
    animate \
    optimize \
    delay 100 \
    size 300, 300 \
    background "#ffeedf" \
    crop \
    font "Times-Roman,10"
set output "animate.gif"
set size square
set xrange[0:2]
set yrange[-0.7:0.9]
set xzeroaxis
set title "Анимация в gnuplot"
do for [i=0:10] {
  set arrow 1 from 0.15, 0.85 to 0.15, exp(-(i+i/10.0)/15.)-0.15 ls 3 lw 2
  plot \
    sin(10.*x)*exp(-x) title "i = 0" lw 2, \
    sin(10.*x)*exp(-x-i/10.0) lw 2 title sprintf("i = %d",i)
}

Результат выглядит таким образом:

Анимация в gnuplot
Пример анимации в gnuplot