前期一篇文章:Modern GMT Series:Slice in 3D View (三维切片图)中提到了在科研作图中会经常遇到三维作图的问题,而且GMT可以做三维图且导出的图片质量非常高!但是也提到了当前GMT版本中的三维绘图存在漏洞。主要两个问题:(1)切片位置错乱;(2)三维文字镜像。就这两个问题极大的限制了GMT三维作图的应用。因为最近论文里面要做三维立体图(地理坐标+笛卡尔坐标+海底地形+剖面切片等),找了找也没找到更好的解决方案,干脆自己动手丰衣足食——修改GMT的源代码。经过一天半的努力,已经比较完美的修复了这两个漏洞。目前官方版本中并没有修复此bug。 下面就介绍一下修复漏洞的过程和最终效果!
先上一张BUG修复后的效果图鉴赏一下
注: 由于我的论文正在审稿中,不便上传较为复杂的绘图结果,暂用一个相对简单的图来代替。
简单例子
问题描述:绘制一个三维立方体并在每个面上标注文字以及设置每个面具有不同颜色且半透明;水平旋转45度,然后x轴和y轴标注坐标标签。
GMT官方版本运行的结果
绘图代码
# Test 3D View of GMT: simple example
# Zhikui Guo, 2018-12-09, GEOMAR, Germany
function preset()
{
figname=Test_3d
angle_view=-45/25
width_fig_x=10
width_fig_y=10
width_fig_z=7
# 透明度
alpha_profile=50
# range
xmin=0
xmax=100
ymin=0
ymax=50
zmin=-20
zmax=0
xc=`echo $xmin $xmax | awk '{print $1+($2-$1)/2}'`
yc=`echo $ymin $ymax | awk '{print $1+($2-$1)/2}'`
zc=`echo $zmin $zmax | awk '{print $1+($2-$1)/2}'`
len_z=`echo $zmin $zmax | awk '{print ($2-$1)}'`
}
# 1. apply theme
# . styles.sh
# MonokaiTheme
# 常用代码头文件:绘制logo
# . stdafx.sh
# 范围和颜色等设置
preset
# plot
gmt begin $figname pdf,png
gmt basemap -JX$width_fig_x/$width_fig_y -JZ$width_fig_z -R$xmin/$xmax/$ymin/$ymax/$zmin/$zmax -Ba -Bza+l"Z(m)" -BwsenZ+gred -pz$angle_view/$zmin
echo "$xc $yc zmin plane" | gmt pstext -JZ -p -F+f20p,Helvetica-Bold,blue=thinner,white+jCM+a190 -Dj0c/0c
gmt basemap -JX$width_fig_x/$width_fig_y -JZ$width_fig_z -R$xmin/$xmax/$ymin/$ymax/$zmin/$zmax -Bwsenz+ggray -pz$angle_view/$zmax
echo "$xc $yc zmax plane" | gmt pstext -JZ -p -F+f20p,Helvetica-Bold,blue=thinner,white+jCM+a190 -Dj0c/0c
gmt basemap -JX$width_fig_y/$width_fig_z -JZ$width_fig_x -R$ymin/$ymax/$zmin/$zmax/$xmin/$xmax -Ba -BwSenz+glightblue@$alpha_profile -Bx+l"Y(m)" --MAP_FRAME_PEN=1,black@0 --MAP_ANNOT_OFFSET=-0.2 -px$angle_view/$xminn
echo "$yc $zc ymin plane" | gmt pstext -JZ -p -F+f20p,Helvetica-Bold,blue=thinner,white+jCM+a45 -Dj0c/0c
gmt basemap -JX$width_fig_x/$width_fig_z -JZ$width_fig_y -R$xmin/$xmax/$zmin/$zmax/$ymin/$ymax -Ba -BwSenz+glightgreen@$alpha_profile -Bx+l"X(m)" --MAP_FRAME_PEN=1,black@0 --MAP_ANNOT_OFFSET=-0.2 -py$angle_view/$ymax
echo "$xc $zc xminn plane" | gmt pstext