рекомендации

суббота, 9 ноября 2019 г.

Создание анимированного изображения в формате gif с помощью R и ImageMagick

Цель этого руководства - показать вам пошагово создание анимированного GIF-изображения с помощью R и ImageMagick. Сначала вы должны установить ImageMagick.

Также возможно создавать анимированные изображения .gif, используя только R, с помощью write.gif () в пакете caTools.

Код R, описанный в этом руководстве, был протестирован на Mac OS X 10.6.8 с R 2.13

Пример 1. Создание обратного отсчета

Обратный отсчет от 10 до 1. Мы создадим его за 4 шага.


1. Создание чистого рабочего каталога под названием «examples».
2. Создание изображений .png, каждое из которых содержит число (от 10 до 1).
3. Создание одного изображения Gif с использованием ImageMagick.
4 - Удаление png-файлов, которые больше не нужны.

Соответствующий код R показан ниже:

#создание рабочего каталога
dir.create("examples")
setwd("examples") 
 
#Создание файлов .png от 10 до "GO!"
png(file="example%02d.png", width=200, height=200)
  for (i in c(10:1, "G0!")){
    plot.new()
    text(.5, .5, i, cex = 6)
  }
dev.off()
 
# Конвертирование файлов .png в один .gif с помощью ImageMagick
system("/opt/local/bin/convert -delay 80 *.png example_1.gif")
# Удаление файлов .png из рабочего каталога
file.remove(list.files(pattern=".png"))

1. Функция system() выполняет команду преобразования, как в терминале. Я использую абсолютный путь к команде преобразования. В моем случае это: /opt/local/bin/convert. В некоторых случаях работает команда  system("convert -delay 80 *. Example_1.gif png").
2. Флаг -delay - это время между двумя изображениями (скорость анимации).
3. Часть "%02d" в имени файла автоматически увеличивает имена файлов .png

Результат



Пример 2. Создание трехмерной анимированной графики

Мы создадим трехмерный график поверхности для визуализации линейной модели с использованием пакета lattice. 3D-графику можно создавать также с помощью пакета rgl.

library(lattice)
b0 = 10
b1 = .5
b2 = .3
g = expand.grid(x = 1:20, y = 1:20)
g$z = b0 + b1*g$x + b2*g$y
 
png(file="example%03d.png", width=300, heigh=300)
  for (i in seq(0, 350 , 10)){
    print(wireframe(z ~ x * y, data = g,
              screen = list(z = i, x = -60)))
  }
dev.off()
 
# конвертируем файл .png в .gif с помощью ImageMagick
system("/opt/local/bin/convert -delay 40 *.png example_2_reduced.gif")
 
# Удаляем файл .png
file.remove(list.files(pattern=".png"))

Результат




Комментариев нет:

Отправить комментарий