使用GMT程序包内的movie命令可以生成动画,更好地展示数据的动态变化。下面是一个利用该命令绘制动画的简单例子:

1. 准备程序

首先编写动画背景图的生成脚本,包括生成绘图所需的数据等工作也可以在此完成(如果已有外部数据则不需要)。在实际运行中不需要手动执行此脚本,而是通过movie命令调用。

# 使用heredoc方式将脚本保存到一个shell文件pre.sh
# 在<<后添加-表示忽略tab制表符(注意不会忽略空格)
cat <<- EOF > pre.sh
	# 使用gmt math生成数据,=号后接输出文件名称
	# -T命令指定x坐标范围
	# T SIND指定要计算的函数名称
	gmt math -T0/360/10 T SIND = sin_point.txt
	gmt math -T0/360/1 T SIND = sin_curve.txt
	# 开始绘制底图
	gmt begin
		# 使用gmt basemap绘制一张空的底图 具体的名称含义查看gmt文档
		# -R指定坐标范围 -JX指定投影类型和地图大小 -X -Y平移图像
		# -B指定坐标轴样式(包括ticks、labels和grids设置等)
		# --FONT_ANNOT_PRIMARY设置字体大小
		gmt basemap -R0/360/-1.2/1.6 -JX22c/11.5c -X1c -Y1c \
		-BWSne+glightskyblue -Bxa90g90f30+u@. -Bya0.5f0.1g1 --FONT_ANNOT_PRIMARY=9p
	gmt end
	# 结束
EOF

2. 准备主程序

编写动画生成的主脚本。movie命令内置了一批常量和变量可供使用,其中常量包括:

  1. MOVIE_WIDTH 画布的宽度(整个电影画面);
  2. MOVIE_HEIGHT 画布的高度(整个电影画面);
  3. MOVIE_DPU 当前每单位点数;
  4. MOVIE_RATE 当前每秒帧数;
  5. MOVIE_NFRAMES 帧的总数。此外,如果使用-I名称,则列出的任何静态参数也将可用于所有脚本。

变量包括:

  1. MOVIE_FRAME 当前帧号(整数,例如136);
  2. MOVIE_ITEM 格式化的帧号(字符串,例如000136);
  3. MOVIE_NAME 当前帧的名称前缀(即prefix_MOVIE_ITEM)。此外,如果给定了时间文件,则还会设置变量MOVIE_COL0、MOVIE_COL1等,从而在时间文件中每列产生一个变量。如果时间文件有尾随文本,则可以通过变量MOVIE_TEXT访问该文本,如果单词拆分是由-T+w显式请求的,或者通过在-L或-P中选择单词标签隐式请求的),则尾随文本也会拆分为单个单词参数MOVIE_WORD0、MOVIE_WORDER1等。
# 使用heredoc方式将脚本保存到一个shell文件main.sh
# 在<<后添加-表示忽略tab制表符(注意不会忽略空格)
cat << EOF > main.sh
gmt begin
	# Plot smooth blue curve and dark red dots at all angle steps so far
	# -Q 快速数学计算 此处为将MOVIE_FRAME*10的结果赋值给last变量
	last=$(gmt math -Q ${MOVIE_FRAME} 10 MUL =)
	# -qi0:${last} 读入前last行并传递给plot命令绘图
	# -W1p,blue线宽1p,蓝色 其他设置与pre.sh内设置保持一致
	gmt convert sin_curve.txt -qi0:${last} | gmt plot -W1p,blue -R0/360/-1.2/1.6 -JX22c/11.5c -X1c -Y1c
	# 使用plot命令绘制已经经过的点
	# -Sc0.1i圆圈 -Gdarkred填充为暗红色
	gmt convert sin_point.txt -qi0:${MOVIE_FRAME} | gmt plot -Sc0.1i -Gdarkred
	# Plot bright red dot at current angle and annotate
	# 使用plot命令绘制当前经过的点
	# -Sc0.1i圆圈 -Gred填充为红色
	# <<< 是here-string 输入数据
	# ${MOVIE_COL0} ${MOVIE_COL1} 坐标位置 
	gmt plot -Sc0.1i -Gred <<< "${MOVIE_COL0} ${MOVIE_COL1}"
	# 使用text命令绘制标签
	# 使用printf生成标签
	# -F设置字体 -N不截断字符串 -D设置标签位置
	printf "0 1.6 a = %3.3d" ${MOVIE_COL0} | gmt text -F+f14p,Helvetica-Bold+jTL -N -Dj0.1i/0.05i
gmt end
EOF

3. 运行movie命令生成视频

# -S 添加前景GMT现代模式脚本的名称,该脚本将构建一个附加到所有帧的静态前景图覆盖。或者,提供正确画布大小的PostScript文件作为前景。
# -C 设置视频分辨率
# -T 设置帧数,从<min>/<max>/<inc>[+n]创建时间,或提供具有特定于帧的信息的文件(本例子的情况)。如果使用<min>/<max>/<inc>,则使用+n来指示<inc>实际上是帧数。如果<timefile>不存在,则必须由通过-Sb给出的后台脚本创建。
# -V 更改运行信息的详细程度
# -D 设置电影显示帧率(帧/秒)[默认为24]
# -Z 转换为电影后擦除目录<prefix>[仅保留带PNG的目录]。附加s以删除所有输入脚本(主脚本和通过-E、-I、-s的任何文件)。
# -N 同时创建主框架图(即输入动画的名称)
# -F 设置动画的格式
gmt movie main.sh -Sbpre.sh -Chd -Tsin_point.txt -Vi -D5 -Zs -Nanim01 -Fmp4

4. 一些有用的信息

图片无法显示
Canvas尺寸设置参考图

“MOVIE_WIDTH和MOVIE_HEIGHT参数反映画布尺寸。您可以使用常规的-X和-Y选项为预期的绘图设置逻辑原点[72p,72p],并使用投影参数(-J)指示选定的绘图区域(绿色)。”

更多movie命令的用法可在GMT网站上查看

查看完整的脚本