PyQt5にmatplotlibを埋め込んでグラフを表示する

PyQt5、matplotlibを埋め込むことができるようです。
user_interfaces example code: embedding_in_qt5.py

使い方を調べてみます。


シンプルなサンプル



参考にしたソースから、極力シンプルなプログラムに切り出して構造を理解します。


  1. # -*- coding:utf-8 -*-
  2. import matplotlib
  3. matplotlib.use('Qt5Agg')
  4. from PyQt5 import QtCore, QtWidgets
  5. from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
  6. from matplotlib.figure import Figure
  7. class ApplicationWindow(QtWidgets.QMainWindow):
  8.     def __init__(self):
  9.         QtWidgets.QMainWindow.__init__(self)
  10.         self.main_widget = QtWidgets.QWidget(self)
  11.         l = QtWidgets.QVBoxLayout(self.main_widget)
  12.         
  13.         # --------------------------------------------
  14.         # FigureCanvasに表示するグラフ
  15.         fig = Figure()
  16.         # グラフを表示するFigureCanvasを作成
  17.         fc = FigureCanvas(fig)
  18.         # グラフの設定
  19.         fc.axes = fig.add_subplot(111)
  20.         fc.axes.plot([1, 2, 3], [2, 3, 4])
  21.         # 描画設定
  22.         fc.setParent(self.main_widget)
  23.         FigureCanvas.setSizePolicy(fc,
  24.                                  QtWidgets.QSizePolicy.Expanding,
  25.                                  QtWidgets.QSizePolicy.Expanding)
  26.         FigureCanvas.updateGeometry(fc)
  27.         # --------------------------------------------
  28.         # 作成したFigureCanvasを画面に追加
  29.         l.addWidget(fc)
  30.         # 中央に配置
  31.         self.setCentralWidget(self.main_widget)
  32. qApp = QtWidgets.QApplication([])
  33. aw = ApplicationWindow()
  34. aw.setWindowTitle("matplotlib sample")
  35. aw.show()
  36. qApp.exec_()



ポイントは
・FigureCanvasというmatplotlibのグラフを配置する専用のCanvasをQtの画面に追加する。
・FigureCanvasへはmatplotlibの「Figure」を設定する
・「Figure」を介してグラフの描画を指定する
というところでしょうか。

実行結果はこうなりました。

959_01.png



背景画像の指定



グラフに背景画像を描画してみます。


  1. # -*- coding:utf-8 -*-
  2. import matplotlib
  3. matplotlib.use('Qt5Agg')
  4. from PyQt5 import QtCore, QtWidgets
  5. from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
  6. from matplotlib.figure import Figure
  7. import matplotlib.image as mpimg
  8. class ApplicationWindow(QtWidgets.QMainWindow):
  9.     def __init__(self):
  10.         QtWidgets.QMainWindow.__init__(self)
  11.         self.main_widget = QtWidgets.QWidget(self)
  12.         l = QtWidgets.QVBoxLayout(self.main_widget)
  13.         
  14.         # --------------------------------------------
  15.         # FigureCanvasに表示するグラフ
  16.         fig = Figure()
  17.         # グラフを表示するFigureCanvasを作成
  18.         fc = FigureCanvas(fig)
  19.         # グラフの設定
  20.         fc.axes = fig.add_subplot(111)
  21.         fc.axes.plot([50, 350], [175, 175], 'r', lw=5)
  22.         # 背景画像設定
  23.         im = mpimg.imread("/home/baranche/lena.jpg")
  24.         fc.axes.imshow(im)
  25.         # 描画設定
  26.         fc.setParent(self.main_widget)
  27.         FigureCanvas.setSizePolicy(fc,
  28.                                  QtWidgets.QSizePolicy.Expanding,
  29.                                  QtWidgets.QSizePolicy.Expanding)
  30.         FigureCanvas.updateGeometry(fc)
  31.         # --------------------------------------------
  32.         # 作成したFigureCanvasを画面に追加
  33.         l.addWidget(fc)
  34.         # 中央に配置
  35.         self.setCentralWidget(self.main_widget)
  36. qApp = QtWidgets.QApplication([])
  37. aw = ApplicationWindow()
  38. aw.setWindowTitle("matplotlib sample")
  39. aw.show()
  40. qApp.exec_()



実行結果

959_02.png



動的に変化するグラフ



時間経過により変化するグラフを描画してみます。


  1. # -*- coding:utf-8 -*-
  2. import random
  3. import matplotlib
  4. matplotlib.use('Qt5Agg')
  5. from PyQt5 import QtCore, QtWidgets
  6. from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
  7. from matplotlib.figure import Figure
  8. import matplotlib.image as mpimg
  9. class ApplicationWindow(QtWidgets.QMainWindow):
  10.     def __init__(self):
  11.         QtWidgets.QMainWindow.__init__(self)
  12.         self.main_widget = QtWidgets.QWidget(self)
  13.         l = QtWidgets.QVBoxLayout(self.main_widget)
  14.         
  15.         # --------------------------------------------
  16.         # FigureCanvasに表示するグラフ
  17.         fig = Figure()
  18.         # グラフを表示するFigureCanvasを作成
  19.         self.fc = FigureCanvas(fig)
  20.         # グラフの設定
  21.         self.fc.axes = fig.add_subplot(111)
  22.         self.fc.axes.plot([0, 1, 2, 3], [1, 2, 0, 4], 'r')
  23.         # 描画設定
  24.         self.fc.setParent(self.main_widget)
  25.         FigureCanvas.setSizePolicy(self.fc,
  26.                                  QtWidgets.QSizePolicy.Expanding,
  27.                                  QtWidgets.QSizePolicy.Expanding)
  28.         FigureCanvas.updateGeometry(self.fc)
  29.         # --------------------------------------------
  30.         # タイマーを設定し、update_figureを定期的に呼び出す
  31.         timer = QtCore.QTimer(self)
  32.         timer.timeout.connect(self.update_figure)
  33.         timer.start(1000)
  34.         # 作成したFigureCanvasを画面に追加
  35.         l.addWidget(self.fc)
  36.         # 中央に配置
  37.         self.setCentralWidget(self.main_widget)
  38.     def update_figure(self):
  39.         l = [random.randint(0, 10) for i in range(4)]
  40.         self.fc.axes.cla()
  41.         self.fc.axes.plot([0, 1, 2, 3], l, 'r')
  42.         self.fc.draw()
  43. qApp = QtWidgets.QApplication([])
  44. aw = ApplicationWindow()
  45. aw.setWindowTitle("matplotlib sample")
  46. aw.show()
  47. qApp.exec_()



動いてくれました。

959_03.gif



【参考URL】

user_interfaces example code: embedding_in_qt5.py

関連記事

コメント

非公開コメント

プロフィール

Author:symfo
blog形式だと探しにくいので、まとめサイト作成中です。
Symfoware まとめ

PR




検索フォーム

月別アーカイブ