GMT ver.5 で体重グラフ


mysql> desc body_weight;
+--------------------+------------+------+-----+---------+-------+
| Field              | Type       | Null | Key | Default | Extra |
+--------------------+------------+------+-----+---------+-------+
| 測定日             | date       | YES  |     | NULL    |       |
| 体重               | float      | YES  |     | NULL    |       |
| 摂取カロリー       | float      | YES  |     | NULL    |       |
| 収支カロリー       | float      | YES  |     | NULL    |       |
| 運動目標           | tinyint(1) | YES  |     | NULL    |       |
| 食事目標           | tinyint(1) | YES  |     | NULL    |       |
+--------------------+------------+------+-----+---------+-------+
6 rows in set (0.00 sec)

 上にようなテーブルを用意し、日々の体重や摂取カロリーを記入しておきます。このような、ごく単純なデータベースをGMTを使ってグラフ化してみます。

 体重を折れ線グラフで、カロリーを柱状グラフで描画しています。縦軸を左右2軸としたところが新知見です。


#!/bin/bash
gmt gmtset FONT_ANNOT_PRIMARY 10p,GothicBBB-Medium-UniJIS-UTF8-H
gmt gmtset FONT_ANNOT_SECONDARY 16p,GothicBBB-Medium-UniJIS-UTF8-H
gmt gmtset FORMAT_DATE_MAP="yyyy o"

host="-h 127.0.0.1"
pdffile="./体重-カロリー.pdf"
temp=`mktemp ./XXXX.tmp`
psfile=`mktemp ./XXXX.ps`
for (( month=5; month>=2; month-- ))
do

case $month in
5) date1="2018-5-1";date2="2018-6-1"; flg="-P -K";;
4) date1="2018-4-1";date2="2018-5-1"; flg="-O -K -Y7c";;
3) date1="2018-3-1";date2="2018-4-1"; flg="-O -K -Y7c";;
2) date1="2018-2-1";date2="2018-3-1"; flg="-O -K -Y7c";;
esac

gmt psbasemap -JX15c/5c -R"$date1"T/"$date2"T/1000/4000 \
 -BS -Bpxa1df1D -Bsxa1O $flg >> $psfile

mysql -N life_log $host << _SQL_ > $temp
 select date_format(測定日,'%Y-%m-%dT12:00:00'),摂取カロリー from body_weight
  where "$date1"<=測定日 and 測定日<"$date2" order by 測定日;
_SQL_
gmt psxy -J -R -BnSEw -By500+l'kcal' -Sb0.5 -W1p -Gwhite -O -K $temp >> $psfile

mysql -N life_log  $host << _SQL_ > $temp
 select date_format(測定日,'%Y-%m-%dT12:00:00'),収支カロリー from body_weight
  where "$date1"<=測定日 and 測定日<"$date2" order by 測定日;
_SQL_
gmt psxy -JX15c/5c -R"$date1"T/"$date2"T/1000/4000 \
 -BnSEw -By500+l'kcal' -Sb0.5 -W1p -G#AAAAAA $temp -O -K >> $psfile

mysql -N life_log  $host << _SQL_ > $temp
 select date_format(測定日,'%Y-%m-%dT06:00:00'),体重 from body_weight
  where "$date1" - interval 1 day<=測定日 and 
  測定日<"$date2" + interval 1 day order by 測定日;
_SQL_

gmt psxy -JX15c/5c -R"$date1"T/"$date2"T/64.5/70.5 \
 -BnSeW -By1g1+l'kg' -W1p,red $temp -O -K >> $psfile

mysql -N life_log  $host  << _SQL_ > $temp
 select date_format(測定日,'%Y-%m-%dT12:00:00'),65.2 from body_weight
  where "$date1"<=測定日 and 測定日<"$date2"
  and 運動目標 order by 測定日;
_SQL_
gmt psxy -J -R $temp -Sc0.2c -W1p -Gcyan -O -K >> $psfile

mysql -N life_log  $host << _SQL_ > $temp
 select date_format(測定日,'%Y-%m-%dT12:00:00'),64.8 from body_weight
  where "$date1"<=測定日 and 測定日<"$date2"
  and 食事目標 order by 測定日;
_SQL_
gmt psxy -J -R $temp -Sh0.2c -W1p -Gorange -O -K >> $psfile

done

cat << + |\
gmt pslegend -R -J -Dx0.5c/0.5c+w3.5c/3.5c+jBL \
 -F+p1p,black+gwhite -O >> $psfile
N 1
S 0.3c - 0.25c 0/0/0 1p,red 0.8c 体重
G 0.3c
S 0.3c s 0.5c white 1p,black 0.8c 摂取カロリー
G 0.3c
S 0.3c s 0.5c #AAAAAA 1p,black 0.8c 収支カロリー
G 0.3c
S 0.3c c 0.2c cyan 1p,black 0.8c 速歩30分達成
G 0.3c
S 0.3c h 0.2c orange 1p,black 0.8c ビール5缶達成
+

ps2pdf $psfile $pdffile
rm $temp $psfile

f:id:S_E_Hyphen:20180409140131j:plain

 

ブロッコリーの軸

突然ですが、ブロッコリーの軸(茎)ってどうしてますか?

あのよく食べられる食感の良い部分は、実はブロッコリーの花なのだそうです。元々淡泊な味なので硬い軸の部分は余らせてしまったりすることが、しばしば有りました。

そこで余った軸を細かく切って、漬け物にしてみました。劇的に美味しくなるわけではありませんが、2~3日塩漬けにするだけで御飯の御供としては使えるようになりましたよ。

f:id:S_E_Hyphen:20180404100757j:plain

GMT ver.5 で写真整理

f:id:S_E_Hyphen:20180328154804p:plain

上図のように、ファイル名で対応関係を示した写真とグラフ画像が存在します。

これらをA4ポートレートの用紙に配置するスクリプトです。

ちなみに、これらのグラフ画像も 画像ファイルからRGB値を取り出す で出力したRGB値から GMT ver.5 を使用してスペクトルを描画したものです。

 

#/bin/bash
psfile=画像.ps
gmt gmtset MAP_GRID_PEN_PRIMARY 0.2p,#AAAAAA
gmt psbasemap -JX17c/25c -R0/17/0/25 -Bg0.1 -P -K > $psfile
gmt gmtset MAP_GRID_PEN_PRIMARY 1.0p,#000000
gmt psbasemap -JX17c/25c -R0/17/0/25 -Bg1 -P -O -K >> $psfile

y=17 # 画像の下端
for thema in 海 崖 百合
do

# キャプションの上端
y2=`bc -l << _BC_
 $y - 0.1
_BC_`
# 写真画像の貼り付け
gmt psimage ${thema}.jpg -J -R \
   -Dx2.0c/${y}c+r300+w4.064c/7.315c+jBL -O -K >> $psfile
# 写真画像のキャプション
echo 6.064 ${y2} ${thema}.jpg |\
 gmt pstext -J -R \
  -F+jTR+a0.0+f12p,GothicBBB-Medium-UniJIS-UTF8-H,0/0/0\
  -Gwhite -O -K >> $psfile
# グラフ画像の貼り付け
gmt psimage ${thema}_graph.jpg -J -R \
   -Dx7.0c/${y}c+r300+w8.467c/7.315c+jBL -O -K >> $psfile
# グラフ画像のキャプション
echo 15.467 ${y2} ${thema}_graph.jpg |\
 gmt pstext -J -R \
  -F+jTR+a0.0+f12p,GothicBBB-Medium-UniJIS-UTF8-H,0/0/0\
  -Gwhite -O -K >> $psfile

# 画像の下端8cm下げ
y=`expr $y - 8`

done

convert -density 150 -quality 69 画像.ps 画像.jpg

 主目盛1cm、副目盛1mmの方眼紙を作成し、写真を右から2cmに、グラフを右から7cmに配置します。

下から17cm、9cm、1cmの位置に、それぞれのテーマごとに配置します。

ちなみに写真の画素数は480×864、グラフ画像は1000x864です。psimage のw4.064c/7.315cとか、w8.467c/7.315cというオプションにより、解像度300DPIで、アスペクト比も保存されるように設定しています。

f:id:S_E_Hyphen:20180329084841j:plain

例ではconvert コマンドでJPEG画像に変換していますが、この応用として何ページ分も書き出して、PDFファイルにしてしまうことも容易です。

 

画像ファイルからRGB値を取り出す

convert コマンドで各画素のRGB値を取得し、MYSQLを使用して色調加工するというスクリプトです。convert コマンドの使用方法については、

ImageMagickで画像からRGB値を取り出す、またその逆 - Qiita

大変参考にさせて頂きましたので、ほとんど備忘録のようなものです。

 

f:id:S_E_Hyphen:20180324153553j:plain
f:id:S_E_Hyphen:20180324153614j:plain
左:元画像     右:加工後

 

#!/bin/bash
#convert -resize 240x432 photo_org/DSC00097.JPG 崖.jpg
#convert -resize x432 -crop 240x432+50+0 photo_org/DSC00098.JPG 海.jpg
#convert -auto-orient -resize x432 photo_org/P3060023.JPG 椿.jpg
#convert -auto-orient -resize x432 photo_org/P6120012.JPG 百合.jpg
# ImageMagick pixel enumeration: 243,432,255,srgb

for thema in 海 # 画像ファイル
do

temp=`mktemp ./XXXX.tmp`

# JPEG形式を平テキストに変換し、データベース登録
convert ${thema}.jpg txt: |\
 awk -F"[,:)]" 'NR>1{print $1,$2,$3,$4,$5}' |\
 sed -e "s/(//g" |\
 awk '{print $1,$2,$3,$4,$5}' > $temp
mysql image << _SQL_
 drop table if exists ${thema};
 create table ${thema} (
  x int,
  y int,
  r int,
  g int,
  b int
 );
 load data local infile "$temp" 
    into table ${thema}
    fields terminated by " "(x,y,r,g,b);
_SQL_

rm $temp

# XY方向それぞれの画素数を取得
nx=`mysql image -N <<_SQL_
 select max(x)-min(x)+1 from ${thema};
_SQL_`
ny=`mysql image -N <<_SQL_
 select max(y)-min(y)+1 from ${thema};
_SQL_`

# ここで赤画層と緑画層の加工を実施 mysql image << _SQL_ update ${thema} set r=0 where b-r>48; update ${thema} set g=0 where b-g>64; _SQL_ # CONVERTコマンドで使用可能なテキストファイルに変換 printf "# ImageMagick pixel enumeration: %d,%d,255,srgb\n" $nx $ny > ${thema}.txt mysql image -N <<_SQL_ > $temp select x,y,r,g,b from ${thema} order by x,y; _SQL_ cat $temp |\ awk '{printf "%3d,%3d: (%3d,%3d,%3d)\n",$1,$2,$3,$4,$5}' \ >> ${thema}.txt # テキスト形式を再度JPG形式画像に変換 convert ${thema}.txt ${thema}_blue.jpg rm $temp done