2012年

7月

25日

[TIPS]グラフ付きの帳票を作成する方法

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)を使用しているので,拡大しても曲線が滑らかに表示されます。