Technofara

Golangエンジニア!仕事で必要になって勉強した事とか、新しい事とか色々まとめたりを緩くやります。技術系と思考系だけにしておきます、

Pythonを使ってデータ比較&グラフに日本語を表示

準備

IPAフォントを使うので、ダウンロード

http://ipafont.ipa.go.jp/index.html

比較するデータを2つ準備

今回は、気象庁から12月1日と2日の練馬区の気温データを取ってくる http://www.data.jma.go.jp/obd/stats/etrn/view/hourly_a1.php?prec_no=44&block_no=1002&year=2013&month=12&day=1&view=p1 http://www.data.jma.go.jp/obd/stats/etrn/view/hourly_a1.php?prec_no=44&block_no=1002&year=2013&month=12&day=02&view=p1

これを今回は手作業で

1 0.0 3.7 0.0
2   0.0 3.0 0.0
3   0.0 3.1 0.8
4   0.0 2.2 0.0
5   0.0 2.1 0.3
6   0.0 1.4 0.3
7   0.0 1.7 0.4
8   0.0 4.4 1.2
9   0.0 7.9 0.8
10  0.0 9.5 1.9
11  0.0 10.6    1.7
12  0.0 11.8    0.3
13  0.0 13.3    0.9
14  0.0 14.0    0.7
15  0.0 14.1    0.6
16  0.0 12.2    0.1
17  0.0 10.4    0.5
18  0.0 9.0 0.1
19  0.0 8.4 0.0
20  0.0 8.0 0.3
21  0.0 7.4 0.0
22  0.0 7.4 0.6
23  0.0 6.6 1.3
24  0.0 5.9 0.3

こんなかんじと

1 0.0 5.5 1.3
2 0.0 5.5 0.8
3 0.0 4.7 0.9
4 0.0 3.3 0.1
5 0.0 3.1 0.0
6 0.0 2.6 0.3
7 0.0 3.0 0.8
8 0.0 5.3 0.9
9 0.0 7.8 0.1
10  0.0 10.0  0.4
11  0.0 12.0  1.1
12  0.0 13.0  1.4
13  0.0 14.0  1.4
14  0.0 14.3  0.9
15  0.0 14.4  1.0
16  0.0 13.3  0.6
17  0.0 10.1  0.0
18  0.0 9.6 0.0
19  0.0 8.6 0.5
20  0.0 8.8 1.0
21  0.0 8.9 1.8
22  0.0 8.3 1.4
23  0.0 7.7 1.1
24  0.0 7.1 0.7

これでデータ準備完了

それではグラフを作ってみよう

スクリプト作成

#!/usr/bin/env python
# vim: set fileencoding=utf-8 :
#
# Author:   shinofara
# Date:     2013-12-03
#
import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as pl
import matplotlib.font_manager as fm

# 日本語フォント
prop = fm.FontProperties(fname='/home/yshinoha/src/ipaexg.ttf')

# 各データを読み込みデーター名と共に配列化
dataset = [
    ("2013/12/01", np.loadtxt("1201.csv")),
    ("2013/12/02", np.loadtxt("1202.csv")),
]

# 各データのY値をCondition1からの相対値に変更する
ymin = np.min(dataset[0][1][:,0])
ymax = np.max(dataset[0][1][:,0])
ydif = ymax - ymin
#for label, data in dataset:
#    data[:,0] = data[:,0] / ydif * 10

# 各データをプロット
for label, data in dataset:
    # X, Yデータを描画(step1のようにX,
    # Yに分けても良いが、わけなくても問題ない)
    pl.plot(data[:,0], data[:,2], label=label)

# グラフのスーパータイトルを指定(オプション)
# 複数グラフを表示した際などに総括タイトルとして使用することが多い
pl.suptitle(u"東京都練馬区の気温", fontproperties=prop)

# グラフのタイトルを指定(オプション)
pl.title(u"2013/12/01と02 練馬区 - 1日の気温", fontproperties=prop)

# X軸, Y軸のラベルを設定(オプション)
# 必要であればLaTeX的な指定も$で囲むことで可能。
# 例えば文字中に$\AA$とするとオングストロームの記号を表示可能。
pl.xlabel(u"時間", fontproperties=prop)
pl.ylabel(u"気温", fontproperties=prop)

# X軸, Y軸の範囲を指定(オプション)
# 他のグラフと合わせる場合などに便利だが指定しない場合は自動的に見やすい
# 範囲となるため理由がない限り指定しないほうが多い
#pl.xlim(450, 650)
#pl.ylim(0, 100)

# グラフにグリッドを表示(オプション)
pl.grid()

# 複数のプロットがあるため凡例を表示
pl.legend()

# グラフを表示 or 保存
#pl.show()               # 表示
pl.savefig("step2.png") # 保存(svg, epsなどにも対応

少しだけ説明を加えると

# font managerを使えるようにする
import matplotlib.font_manager as fm

# 日本語フォントを設定
prop = fm.FontProperties(fname='./ipaexg.ttf')

# 日本語を設定
pl.suptitle(u"東京都練馬区の気温", fontproperties=prop)

作成処理実行

$ python test02.py

結果はこんな感じ

f:id:shinofara:20131204002247p:plain