3-9-甘特图

27 Jul 2018

#! /bin/bash

##
#整体设计思路
# 用psxy一行一行数据的读取和绘制。

if [ $# -ne 1 ] && [ $# -ne 2 ]  && [ $# -ne 3 ] ;then
	echo 'gmtedi.sh - A tool for plotting the MT EDI data file using GMT 5.3.3.'
	echo ' - Usage: gmtedi.sh site.edi [outfilename scale]'
	echo ''
	echo ' scale is the width of every site '
	echo 'Example:you have 20 sites, and scale is 1(default) ,then the width of this figure is 1*20=20cm.'
	echo ''
	echo ' data.txt includes site name,  begainning of time,    end of time'
	echo 'data example(one line):NMG04a 2018-07-21T10:30:30 2018-08-01T17:20:20'
	echo ''
	echo ' - Dependences: gawk, gmt, bc'
	exit
fi # script info.

DATA=$1
f=gantt_chart
SCA=1
if [ $# -eq 2 ]; then
	f=$2
fi
if [ $# -eq 3 ]; then
	f=$2;
	SCA=$3;
fi
PDF=$f.pdf
PNG=$f.png
ASC=$f.asc
PS=$f.ps

# time range
T_MIN=2018-07-06
T_MAX=2018-09-20

# $DATA lines
# 取DATA文件的行数
NUM_LINES=`awk '{print NR}' $DATA|tail -n1`

# set range
#if [ $NUM_LINES -eq 0 ]; then
#	echo " the data file is empty";
#	exit 1;
#elif [ $NUM_LINES -lt 20 ]; then
#	DF=`echo "sclae=2; 15/$NUM_LINES" | bc`
#else 
#	DF=`echo "scale=2; 20/$NUM_LINES" | bc`
#fi

#scale
# 计算figure的大小,注意用bc计算的精度问题,即用scale设置保留小数点后几位,若不设置,很容出现累计误差。
R_LENGTH=`echo  "scale=2; $SCA+$SCA*$NUM_LINES" |bc`

JJ=-JX${R_LENGTH}c/${SCA}c
RR=-R${T_MIN}T/${T_MAX}T/0/1
JJ_FRAME=-JX${R_LENGTH}c/${R_LENGTH}c
PEN_WIDTH=`echo "scale=2; $R_LENGTH*0.8" |bc`

# gmt set
gmt set FORMAT_DATE_MAP=o 
# 这里设置读入时间序列的格式 2018-09-10T16:30:30;具体其他的我还没有搞懂
gmt set FORMAT_DATE_IN=yyyy-mm-dd FORMAT_CLOCK_IN=hh:mm:ss
gmt set FONT_LABEL ${PEN_WIDTH}p
gmt set MAP_FRAME_WIDTH=0.4p
gmt set FONT_ANNOT_PRIMARY +${PEN_WIDTH}p

# plot frame
# 先绘制一个大的框架,再在框架里面绘制一个个时间进度条。
#两次使用psbasemap,第一次画X的时间轴,第二次画其余三条轴,设置没有刻度。
#这里的B轴有p和s两级标注,离轴近的是p,7R表示7天绘制一次,但显示每周第一天,即周1,如2018-9-3是周一,f1d表示一天一个刻度,s级中,1O表示一个月标注一次,用英文而不是数字,数字用小写o。
gmt psbasemap $JJ_FRAME $RR -Bpa7Rf1dg1O -Bsa1O -BS  --MAP_GRID_PEN_PRIMARY=0.1p,green -K -P >$PS
gmt psbasemap $JJ_FRAME $RR  -Bwen -Bya2 --MAP_TICK_LENGTH=0p -K -O >>$PS

#gmt psbasemap $JJ_FRAME $RR -Bpg1d -BwSen --MAP_GRID_PEN_PRIMARY=0.1p,lightgray  -K -O >>$PS

# 这里DF为每次向上移动的距离,分两次移动,一次移动时间条,一次移动坐标轴标注。
DF=`echo "scale=2; $SCA*0.5" |bc`
gmt psbasemap $JJ $RR -BW -Y-${DF}c -K -O >>$PS
#get data and plot every line
for((k=1;k<$NUM_LINES+1;k++)); do
    # 这里用gawk和sed取第k行1,2,3列。
    SITE=`gawk '{print $1}' $DATA| sed -n "${k}p"`
	T_BEGIN=`gawk '{print $2}' $DATA| sed -n "${k}p"`
	T_END=`gawk '{print $3}' $DATA| sed -n "${k}p"`
#	echo "k=$k;SITE=$SITE"
	gmt psxy $JJ $RR -Y${DF}c -Byf1 -BW -W${PEN_WIDTH}p,blue --MAP_TICK_LENGTH=3p -K -O>>$PS << EOF
	$T_BEGIN 1
	$T_END 1
	# 这里EOF好像必须顶格,否则出错。
EOF
	gmt psbasemap $JJ $RR -Y${DF}c -BW -Byf1+L"$SITE" --MAP_TICK_LENGTH=0p -K -O>>$PS
done
# 这里只是为了-O,方便前面修改。
gmt psbasemap $JJ $RR -BW -O >> $PS

gmt psconvert $PS -Tf -A -F$PDF
gmt psconvert $PS -Tg -A -F$PNG

附件:data.txt
NMG01a 2018-08-01T16:30:30 2018-08-10T17:20:20
NMG02a 2018-08-09T10:30:30 2018-08-20T17:20:20
NMG03a 2018-08-01T16:30:30 2018-09-10T17:20:20
NMG04a 2018-08-21T10:30:30 2018-09-01T17:20:20

figure:

image.png