12.8 用GMT制作动画

GMT只能生成PS格式的图片,所以GMT自身并不具有制作动画的功能。但动画本质上就是将一系列独立的图片按照顺序快速播放,所以可以利用GMT绘制多张独立的图片,并将这些图片作为动画的每一帧。

在制作一个动画时,通常需要按照顺序考虑如下问题:

  1. 一个动画需要多少帧?太少的帧数会导致动画存在不连续感,太多的帧数则可能需要绘制/播放很长时间。建议定义相关变量,使得可以根据实际情况进行微调
  2. 通常一张动图中有很多元素是不变的。比如海岸线底图、一些图例信息等等。这些不变的元素,没有必要为每一帧都重复绘制。可以直接将这些不变的元素绘制完,然后将未关闭的文件复制到新文件中,并在新文件中绘制余下的部分
  3. 帧计数器应初始化为0,并随着循环不断递增
  4. 根据帧计数器中的值构建文件名,文件名必须有规律且唯一。例如 plot_0001.ps 就是不错的命名方式(0001中的前置0不可省略,因为在将一系列图片转换成动画时需要涉及到各帧之间的先后顺序问题)
  5. 将PS文件转换成图片,建议使用GMT自带的 psconvert 模块
  6. 使用ImageMagick的 convert 命令将图片转换成gif或者avi等格式
  7. 删除临时文件

以下是制作动画的整个流程的示意代码:

#!/bin/bash
PS=plot.ps

# 绘制图中的静态元素
gmt cmd1 ... -K > $PS
gmt cmd2 ... -K -O >> $PS

# 开始循环,i为帧计数器,MAX为最大帧数
for ((i=0; i<MAX; i++))
do
     # 构建新文件名plot_xxxx.ps
     file = `echo $i | awk '{printf "plot_%04d.ps", $1}'`
     # 将已经绘制好静态元素的文件复制到新文件
     # 此时file中已经包含了静态元素
     cp $PS $file
     # 向file中添加动态元素
     gmt cmd3 ... -K -O >> $file
     gmt cmd4 ... -K -O >> $file
     gmt cmd5 ... -O >> $file
     # 将PS文件转换为某种图片格式
     gmt psconvert -A -P $file
done

# 利用convert命令将图片转换为GIF动图
convert *.jpg plot.gif

# 清理临时文件
rm *.ps *.jpg