GMT ver.5 を使ってドルチャート描画

まず下記のようなデータベースを準備しておきます。

 

mysql> select updateDate,y2d,d2y from dollar\

     where "2017-6-5"<updateDate order by updateDate limit 10;
+---------------------+--------+--------+
| updateDate          | y2d    | d2y    |
+---------------------+--------+--------+
| 2017-06-05 06:20:00 | 110.79 | 110.29 |
| 2017-06-05 06:30:00 | 110.81 | 110.31 |
| 2017-06-05 06:50:00 |  110.7 |  110.2 |
| 2017-06-05 07:00:00 | 110.73 | 110.23 |
| 2017-06-05 07:10:00 | 110.71 | 110.21 |
| 2017-06-05 07:20:00 | 110.78 | 110.28 |
| 2017-06-05 07:30:00 | 110.83 | 110.33 |
| 2017-06-05 07:40:00 | 110.78 | 110.28 |
| 2017-06-05 07:50:00 | 110.81 | 110.31 |
| 2017-06-05 08:00:00 | 110.76 | 110.26 |
+---------------------+--------+--------+
10 rows in set (0.11 sec)

 

データベース準備にあたって、RSSの取得やxmlの取り扱いについては、 RSSの取得 - あるStray Engineer の日記xmlのmysqlへの登録 - あるStray Engineer の日記 も参考にしてみて下さい。

このデータベースから所望の期間の検索を行ってグラフを描画するスクリプトを作成しました。

f:id:S_E_Hyphen:20170611103229j:plain

今週では6月7日が比較的円高だったみたいですね。同時に金の価格も高かったようです。

 

 


 

#/bin/bash
# 一時ファイル$tempの作成
temp=`mktemp ./XXXX.tmp`
psfile=/home/user/nhk/金ドル.ps

# ドル-円チャートの最大最小値の定義
min_y=105
max_y=115
# 金価格チャートの最大最小値の定義
min_g=4800
max_g=4900

# $dateには現在日時をMYSQLに適した書式で取得
date=`date +'%Y-%m-%d %H:%M:%S'`

# 7日前から現在までのドル価格を検索
if [ ! -z $temp ]
then
mysql life_log -N << _MYSQL_ > $temp
 select updateDate,y2d,d2y from dollar
  where "$date" - interval 7 day<=updateDate
  and updateDate <="$date"
  order by updateDate;
_MYSQL_
fi

# GMT ver.5ではgmtのコマンドは必ずgmtから始まります
# 日本語フォントなどの設定を行っています
gmt gmtset FORMAT_DATE_MAP yy-mm-dd
gmt gmtset FONT_TITLE 12p,GothicBBB-Medium-UniJIS-UTF8-H
gmt gmtset FONT_LABEL 8p,GothicBBB-Medium-UniJIS-UTF8-H
gmt gmtset FONT_ANNOT_PRIMARY 8p,GothicBBB-Medium-UniJIS-UTF8-H

date1=`date -d "$date 6 days ago" +'%Y-%m-%d'`
date2=`date -d "$date 1 days" +'%Y-%m-%d'`
# 軸の設定です
# -JオプションでX軸にTが入っているのは時間軸を示す
# -Rオプションはver.4と変わりないみたいです
# -Bオプションは大きく変わってます。
#  まず図のタイトルを+t"タイトル"で定義してます。
#  ver.4ではX軸/Y軸でしたが、
#  -Bx+l"X軸ラベル" -By+l"Y軸ラベル"
#    と定義するようになりました。
gmt psbasemap -JX25cT/3c \
 -R"$date1"T00:00:00/"$date2"T00:00:00/${ min_y }/${ max_y } \
 -BWESn+t"最近1週間の円/ドル換算レート" \
 -Bxa1Df1D+l"年-月-日" \
 -Bya5g1 \
 -K -Y15c > $psfile
# ドルを買う際の円の値段をグラフ化しています(赤線)。
# psxyの-Wオプションも変わってますね。
# ver.4では -W1/255/0/0でしたが、-W1p,255/0/0に
# なってます。この後ろに線種(破線とか点線とか)
# の指定もできるようです。
cat $temp |\
 awk -v min="$min_y" -v max="$max_y"\
 '$3<min{printf "%sT%s %s\n",$1,$2,min;next}\
  $3>max{printf "%sT%s %s\n",$1,$2,max;next}\
        {printf "%sT%s %s\n",$1,$2,$3}' |\
 gmt psxy -J -R -B -O -K -W1p,255/0/0 >> $psfile
# ドルを売る際の円の値段をグラフ化しています(青線)。
cat $temp |\
 awk -v min="$min_y" -v max="$max_y"\
 '$4<min{printf "%sT%s %s\n",$1,$2,min;next}\
  $4>max{printf "%sT%s %s\n",$1,$2,max;next}\
        {printf "%sT%s %s\n",$1,$2,$4}' |\
 gmt psxy -J -R -B -O -K -W1p,0/0/255 >> $psfile
# pslegendはver.4でもあまり使ったことがないのですが、
# 相当変わったと思います。大体オプションの最中で+とか
# 聞いたことないし…。
gmt pslegend -R -J -DJ${ date2 }/${ max_y }+w2.5+jTR \
 -F+gwhite+i0.1c/1p -K -O << END >> $psfile
N 1
S 0.2c s 0.5c 0/0/255 0.25p 0.6c ドル→円
S 0.2c s 0.5c 255/0/0 0.25p 0.6c 円→ドル
END

#############################
# ここからは金チャートです  #
#############################

# 7日前から現在までの金価格を検索
if [ ! -z $temp ]
then
mysql life_log -N << _MYSQL_ > $temp
 select insertDate,title from gold
  where "$date" - interval 7 day<=insertDate
  and insertDate <="$date"
  and effect=1
  order by insertDate;
_MYSQL_
fi

# 軸の設定です。ドル-円チャートと大体同じです。
gmt psbasemap -JX25cT/3c \
 -R"$date1"T00:00:00/"$date2"T00:00:00/${ min_g }/${ max_g } \
 -BWESn+t"最近1週間の金価格" \
 -Bxa1Df1D+l"年-月-日" \
 -Bya50g10 \
 -K -O -Y-7c >> $psfile

# 金価格を黒丸で表示します。
cat $temp |\
 sed -e "s/金//g" |\
 sed -e "s/円.*$//g" |\
 sed -e "s/,//g" |\
 awk -v min="$min_g" -v max="$max_g" \
 '$3<min{printf "%sT%s %s\n",$1,$2,min;next} \
  $3>max{printf "%sT%s %s\n",$1,$2,max;next} \
        {printf "%sT%s %s\n",$1,$2,$3}' |\
 gmt psxy -J -R -B -O -Sc0.3 -G0/0/0 >> $psfile

#一時ファイルを消去して画像ファイルを変換します。
rm $temp
convert -density 200 -quality 30\
 $psfile `echo $psfile|sed -e "s/.ps/.jpg/g"`