Monday 13 May 2013

はいさー!!

気象庁のでうにょうにょ.どちらかというと sed の練習になった感じ.
とりあえずハイサーグラフを描いてみました.
(本来なら平均値を取る気がするけど)とりあえず2012年の京都.
縦軸に月平均気温,横軸に月降水量をとって月ごとにプロットします.
縦軸:月平均気温(摂氏),横軸;降水量 [mm].
点の上の数字が月を表します.
なるほどなるほど.(?)2007年まで遡って毎年の分を重ね打ちすると
重ねすぎな上に特に plot に工夫をしていないのでずいぶん見難いですが,
やっぱり毎年それなりに違うねんなぁ,というかんじ.
とはいえ冬季や 8月とかは割に揃っている印象です.5月とか結構ばらついてそう.
また別の plot を描いたりしたくなりますね.
これを見ながら去年や一昨年の気候を思い出そうとしましたがあんまり憶えてない.不思議なもんです.

地域差は,ということで反省せず  2012年のデータでいろんな都道府県庁所在地.


更にみにくい
宮崎と高知の降雨量の伸びは流石といったところ,札幌や新潟も特徴が出てます.
那覇はさすが南国.神戸暑い.そして山形の寒暖差はなかなかのものがありますね.
もちろん個別年データでいいんかとか plot もっと工夫すべきとかそういうのはありますが,
ともかくじっくり眺めてるといろいろ見えてきてたのしい.


read more でざっくりどうやって描いたかのメモを置いておきます.
(書き終わって眺めると自分用過ぎてわけがわかりません.)
流れとしてはフォルダ内にダウンロードした csv 群にshell script で
nkf で utf-8 に変換→  sed で .dat 整形→フォルダ内の .dat 群から .plt 生成 → gnuplot 呼び出し
という感じでザクっと svg 画像まで一気に描いてもらうようにしました.




例えば2012年1-12月の平均気温と降水量を昨日の
http://www.data.jma.go.jp/gmd/risk/obsdl/index.php
から貰ってみると,結果はこんな感じ.
shift-jis な感じで来るみたいなので,必要なら nkf とかで変換します.
,京都,京都,京都,京都,京都
年月,平均気温(℃),平均気温(℃),降水量の合計(mm),降水量の合計(mm),降水量の合計(mm)
,,品質情報,,現象なし情報,品質情報
2012/1,4.1,8,31.0,0,8
2012/2,4.1,8,115.0,0,8
2012/3,8.3,5,142.0,0,8
2012/4,14.2,8,118.0,0,8
...(攻略)
 ...品質情報とか(最後の 0,8 など)を適当に削ってとかも sed でやったのだけど,
http://www.data.jma.go.jp/gmd/risk/obsdl/index.php より.
 表示オプションでこのへんをこういう感じにすれば元々省けたみたいですね.
 ともかく. sed で例えば 2012/1 を 1 にしたり, 最初の数行を #でコメントアウトしたり,
, 区切りを tab 区切りに変えて,gnuplot に読みやすい形にします.
これは foo.sed というファイルにすることを書いて保存しておき,
$ sed -f foo.sed [filename]
で呼び出すとやりやすい.
(sed については探せばいろいろありますが,
例えば Linuxコマンド集 - 【 sed 】 文字列の置換,行の削除を行う:ITpro
などは reference としていい感じです. vim で置換とかに慣れてるとなめらか.)
最終的に今回は
#月,平均気温,降水量
1 -4.5 71.5
2 -4.4 57.0
3 0.1 44.5
4 7.0 34.5
5 13.0 83.5
6 17.1 51.5
7 21.8 81.5
8 23.4 121.0
9 22.4 191.0
10 13.0 115.0
11 5.5 219.0
12 -2.3 209.0
1 -4.5 71.5
みたいな形にしました(以下 data.dat と呼びます).
最後に 1月がもう一回入ってるのは, gnuplot で
plot "./data.dat" w lp
とした時に (w lp は with linespoints のこと),そのままだと曲線が閉じないため.
gnuplot 側で閉じる命令とかないのかなと思ったのですが,すぐには見つかりませんでした.
これは元のファイルで 1月がちょうど6行目に来てるのでとりあえずそれをコピーする感じで
sed にて
6h
17G
で実現しています(1月に当たるのを検索してそれをコピーより書きやすかったから).

あとは gnuplot に読んでもらうようの .plt の作成.
$dat には先程の data.dat のファイル名,
$title には data.dat の名前から sed で抽出して title 用にした名前(上のプロットでは 2012-miyazaki とか)
を入れて
echo \
"replot \"./$dat\" u 3:2:1 w labels notitle, \"./$dat\" u 3:2 w lp title \"$title\" "\
>>plot.plt 

のような感じで plot.plt を作っていきます.
これでは最初の plot も replot で書かれてしまいますがそれは最後に直すことにします.
なお,
    replot "foo.dat" u 3:2:1 w labels notitle
の部分では
gnuplot demo script: datastrings.demの下から3つ目を参考に,
plot する点の上に月の数字を描いています.


このあたりの処理を shell script に書いて,更に shell script の for を使って
フォルダ内の適切なファイル名のファイル群にこれをまとめて実行,
for k in `some commands`
    do
        ./foo.sh $k
    done
みたいな感じ.
最後に svg で出力して欲しいので,最初の replot を plot にしつつ
set term svg とかを書き込んで gnuplot に読んでもらう:
sed -e "1s/replot/plot/g" plot.plt > plt.temp
mv plt.temp plot.plt
echo \
"set term svg size 800,600
set output \"`date +%d%m%y-%s`.svg\"
replot" >> plot.plt
gnuplot plot.plt
rm plot.plt
#あれこれ set term とかは一番最初に書いとけばあとから面倒避けられたのでは

output に `date +%d%m%y-%s` を混ぜてるのは複数回やっても上書きされないように.

とまあこんな感じのことを .sh に書いてやれば,
csv ファイルのダウンロードさえやればあとは svg までザクっと作ってくれます.

なんかつらい感じになってきましたね.また書き直すか,小分けにしてまとめてみるか,
このまま流すかどれかにしよう.


参考になるページ:
sed について: Linuxコマンド集 - 【 sed 】 文字列の置換,行の削除を行う:ITpro
sed について2 : sed の使い方 - サーバエンジニアの知恵袋 - livedoor Wiki(ウィキ)
shell script : シェルスクリプト入門 [シェルの作成・実行] (他にもあるけどまあまた)


まああともちろん man は友達です.

No comments:

Post a Comment