我ながら無謀と思いつつやってみた。これに書いてあったコードを殆どそのまま参考にする。
すでに書いている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 件のコメント:
コメントを投稿