金曜日, 10月 08, 2010

PyQt使うの初めてなのにmatplotlibを埋め込んでみた

我ながら無謀と思いつつやってみた。これに書いてあったコードを殆どそのまま参考にする。

すでに書いているmatplotlibを使ったコードの転用が容易になるように、matplotlibのコードとPyQtのコードをできるだけ分離を試みてみた。(追記:以下のコード抹消、こちらに修正コード)

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# for command-line arguments
import sys

# Numpy functions for image creation
import numpy

# Matplotlib Figure object
import matplotlib
import matplotlib.pyplot

# Python Qt4 bindings for GUI objects
import PyQt4.QtGui

# import the Qt4Agg FigureCanvas object, that binds Figure to
# Qt4Agg backend. It also inherits from QWidget
#from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
import matplotlib.backends.backend_qt4agg

# import the NavigationToolbar Qt4Agg widget
#from matplotlib.backends.backend_qt4agg import NavigationToolbar2QTAgg as NavigationToolbar

class ApplicationWindow(PyQt4.QtGui.QMainWindow):
    """Example main window"""
    def __init__(self,figs):
        # initialization of Qt MainWindow widget
        PyQt4.QtGui.QMainWindow.__init__(self)
        # set window title
        self.setWindowTitle("Matplotlib Figure in a Qt4 Window With NavigationToolbar")
        # create a tab widget
        self.tab_widget = PyQt4.QtGui.QTabWidget(self)

        for fig, label in figs:
            # instantiate a widget, it will be the main one
            self.main_widget = PyQt4.QtGui.QWidget(self)
            self.tab_widget.addTab(self.main_widget, label)
            # create a vertical box layout widget
            vbl = PyQt4.QtGui.QVBoxLayout(self.main_widget)
            # instantiate our Matplotlib canvas widget
            qmc = matplotlib.backends.backend_qt4agg.FigureCanvasQTAgg(fig)
            # instantiate the navigation toolbar
            ntb = matplotlib.backends.backend_qt4agg.NavigationToolbar2QTAgg(
                qmc, self.main_widget)
            # pack these widget into the vertical box
            vbl.addWidget(qmc)
            vbl.addWidget(ntb)
            # # set the focus on the main widget
            # self.tab_widget.setFocus()
            # set the central widget of MainWindow to main_widget
            self.setCentralWidget(self.tab_widget)

def draw():
    figs = []

    # Standard Matplotlib code to generate the plot
    fig = matplotlib.pyplot.figure()
    axes = fig.add_subplot(111)
    x = numpy.arange(0.0, 3.0, 0.01)
    y = numpy.cos(1*numpy.pi*x)
    axes.plot(x, y)
    figs.append((fig,"tab 1"))

    fig = matplotlib.pyplot.figure()
    axes = fig.add_subplot(111)
    x = numpy.arange(0.0, 3.0, 0.01)
    y = numpy.cos(2*numpy.pi*x)
    axes.plot(x, y)
    figs.append((fig,"tab 2"))

    fig = matplotlib.pyplot.figure()
    axes = fig.add_subplot(111)
    x = numpy.arange(0.0, 3.0, 0.01)
    y = numpy.cos(3*numpy.pi*x)
    axes.plot(x, y)
    figs.append((fig,"tab 3"))

    return figs

# Create the GUI application
qApp = PyQt4.QtGui.QApplication(sys.argv)

figs = draw()

# Create the Matplotlib widget
mpl = ApplicationWindow(figs)
# show the widget
mpl.show()

# start the Qt main loop execution, exiting from this script
# with the same return code of Qt application
sys.exit(qApp.exec_())

個々のfigに対して画像ファイルとして保存するには、

fig.savefig(filename, dpi=300, transparent=True)
とかすると良い。実はこのあたり結構悩んだ。

複数タブに貼り付ける様にしているのは、任意数の複数グラフを同時表示できるようにしたかったのだけど、貼り付けたいグラフが結構メモリを消費してしまうため、結局のところ必要な分を一辺に貼り付けるのは無理だった。

0 件のコメント: