2016-05-05

wxPython のチャート

JavaFX を利用して大量のデータを LineChart へプロットする GUI アプリケーションを作っています。機能が豊富で気に入っているのですが、対象のデータ量を扱うとヒープメモリが不足して OutOfMemoryError の発生に悩まされています。

Java VM のパラメータチューニングをすることを検討すべきではありますが、その前に、もっとリソースを使わないライブラリがないかどうか評価してみたいと考えました。

wxPython

wxPython は、C++ で書かれた wxWidgets というクロスプラットフォームなウィジェット・ツールキットを Python から利用できるようにラッピングした Python のモジュールです。興味があった Python のプログラミングを始めるきっかけとして良い機会と考えました。

プロットするだけのライブラリであれば他にも興味を惹くものはありますが、GUI アプリケーションである以上、プロットだけでなく一般的な GUI 用のウィジェットも利用できる必要があります。

参考サイト [1] によれば、wav 形式のファイルを読み込ませるとメモリを食い潰して動かなくなるようです。これは本質的に自分が抱えている問題と同じなのですが、程度の違いを確認するために、Python のプログラミングを覚えながら少し評価してみる事にしました。

手始めに、参考サイト [2] に紹介されていたサンプルをちょっといじって実行してみました。

動作環境は次の通りです。

  • OS: Fedora 24 (x86_64, Alpha)
  • python-2.7.11-4.fc24.x86_64
  • wxPython-3.0.2.0-10.fc24.x86_64
  • IDE: eclipse-pydev-4.5.5-2.fc24.x86_64
リスト:MyPlot.py 
# -*- coding: utf-8 -*- 
import wx
import wx.lib.plot as plot

class MyPlot(wx.Frame):
    def __init__(self):
        self.frame = wx.Frame(None, title="wx.lib.plot", id=wx.ID_ANY, size=(410, 340))
        #icon = wx.Icon("./application_x_python.png", wx.BITMAP_TYPE_PNG)
        #self.frame.SetIcon(icon)

        self.panel = wx.Panel(self.frame)
        self.panel.SetBackgroundColour("yellow")
        
        plotter = plot.PlotCanvas(self.panel)
        plotter.SetInitialSize(size=(400, 300))
        # enable the zoom feature (drag a box around area of interest)
        plotter.SetEnableZoom(True)
        plotter.SetEnableGrid(True)
        plotter.SetGridColour('gray')
        
        # list of (x,y) data point tuples
        data = [(1, 2), (2, 3), (3, 5), (4, 6), (5, 8), (6, 8), (12, 10), (13, 4)]
        # draw points as a line
        line = plot.PolyLine(data, colour='red', width=1)
        # also draw markers, default colour is black and size is 2
        # other shapes 'circle', 'cross', 'square', 'dot', 'plus'
        marker = plot.PolyMarker(data, marker='triangle', colour='red')
        # set up text, axis and draw
        gc = plot.PlotGraphics([line, marker], 'Line/Marker Graph', 'x axis', 'y axis')
        plotter.Draw(gc, xAxis=(0, 15), yAxis=(0, 15))
        
        self.frame.Show(True)

app = wx.App()
f = MyPlot()
app.MainLoop()

実行例を以下に示します。簡単なサンプルですが、これをベースに、自分が使う描画用のクラスを作成できそうです。

Python 初心者ですので、参考サイト [3] で勉強中です。このサイトで言及していないウィジェットなどの話題があれば、本ブログで紹介していきたいと思います。

参考サイト

  1. wxPythonのwx.lib.plotでwavファイルをプロットする - yattの日記
  2. Using wxPython for Plotting | DaniWeb
  3. Python入門から応用までの学習サイト

 

ブログランキング・にほんブログ村へ
にほんブログ村

0 件のコメント: