PythonのグラフライブラリMatplotlibを利用して,グラフ付きの帳票を作成します。
プログラムの作成
Matplotlibは出力形式として,PNG, PDF, PostScript, SVGを選択することができます。
このうちField Reportsで対応しているのはPNGとPDFですが,今回はベクトル形式のPDFを選択しました。
Matplotlibでは出力先デバイスとして,ファイル以外にPythonのファイル様オブジェクトも受け付けます。
ここでは,StringIOを出力先として指定しました。
生成したPDFデータは,URIデータストリーム形式に変換して Field Reports に受け渡します。
import matplotlib
from pylab import *
from matplotlib.backends.backend_pdf import PdfPages
import StringIO
import base64
from field import reports
pdfstream = StringIO.StringIO()
def draw(pdfstream):
pdf = PdfPages(pdfstream)
t = arange(0.0, 2.0, 0.01)
s = sin(2*pi*t)
plot(t, s, linewidth=1.0)
xlabel('time (s)')
ylabel('voltage (mV)')
title('About as simple as it gets, folks')
grid(True)
savefig(pdf, format='pdf')
close()
pdf.close()
def urischeme(data):
return 'data:application/pdf;base64,' + base64.b64encode(data)
param = {
"template": {"paper": "A4"},
"resources": {
"image": {
"cairo": "",
},
},
"context": {
"hello": {
"new": "Tx",
"value": "Hello, matplotlib!",
"color": "Red",
"rect": [50, 450, 350, 550]
},
"cairo": {
"new": "Btn",
"image": "cairo",
"rect": [50, 500, 350, 800]
}
}
}
if __name__ == "__main__":
pdf = StringIO.StringIO()
draw(pdf)
data = urischeme(pdf.getvalue())
param["resources"]["image"]["cairo"] = data
reports.set_log_level(5)
reports.render(param, "out.pdf")
実行結果
プログラムを実行するには,以下のコマンドを実行します。
$ python simple_plot.py
ベクトル形式の出力形式(PDF)を使用しているので,拡大しても曲線が滑らかに表示されます。