📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

編集の要約なし
文字列「</source>」を「</syntaxhighlight>」に置換
 
(同じ利用者による、間の8版が非表示)
26行目: 26行目:


<br>
<br>
  <source lang="python">
  <syntaxhighlight lang="python">
  # - * - coding: utf8 - *
  # - * - coding: utf8 - *
   
   
32行目: 32行目:
  import random
  import random
   
   
  from PyQt5.QtWidgets import QApplication, QMainWindow, QMenu, QVBoxLayout, QSizePolicy, QMessageBox, QWidget, QPushButton
  from PyQt5.QtCore import *
  from PyQt5.QtGui import QIcon
  from PyQt5.QtWidgets import *
   
   
  from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
  from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
40行目: 40行目:
   
   
   
   
  class App(QMainWindow):
  class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.left  = 10
        self.top    = 10
        self.title  = "PyQt5 matplotlib example - pythonspot.com"
        self.width  = 640
        self.height = 400
   
   
        self.setWindowTitle(self.title)
    def __init__(self, parent=None):
        self.setGeometry(self.left, self.top, self.width, self.height)
      super(MainWindow, self).__init__(parent)
      self.left   = 10
      self.top   = 10
      self.title  = "PyQt5 matplotlib example - pythonspot.com"
      self.width = 640
      self.height = 400
   
   
        m = PlotCanvas(self, width=5, height=4)
      self.setWindowTitle(self.title)
        m.move(0,0)
      self.setGeometry(self.left, self.top, self.width, self.height)
   
   
        button = QPushButton('PyQt5 button', self)
      m = PlotCanvas(self, width=5, height=4)
        button.setToolTip('This s an example button')
      m.move(0,0)
        button.move(500,0)
        button.resize(140,100)
   
   
        self.show()
      button = QPushButton('PyQt5 button', self)
      button.setToolTip('This s an example button')
      button.move(500,0)
      button.resize(140,100)
   
   
   
   
67行目: 65行目:
   
   
     def __init__(self, parent=None, width=5, height=4, dpi=100):
     def __init__(self, parent=None, width=5, height=4, dpi=100):
        fig      = Figure(figsize=(width, height), dpi=dpi)
      fig      = Figure(figsize=(width, height), dpi=dpi)
        self.axes = fig.add_subplot(111)
      self.axes = fig.add_subplot(111)
   
   
        FigureCanvas.__init__(self, fig)
      FigureCanvas.__init__(self, fig)
        self.setParent(parent)
      self.setParent(parent)
   
   
        FigureCanvas.setSizePolicy(self, QSizePolicy.Expanding, QSizePolicy.Expanding)
      FigureCanvas.setSizePolicy(self, QSizePolicy.Expanding, QSizePolicy.Expanding)
        FigureCanvas.updateGeometry(self)
      FigureCanvas.updateGeometry(self)
        self.plot()
      self.plot()
   
   
   
   
     def plot(self):
     def plot(self):
        data = [random.random() for i in range(25)]
      data = [random.random() for i in range(25)]
        ax  = self.figure.add_subplot(111)
      ax  = self.figure.add_subplot(111)
        ax.plot(data, 'r-')
      ax.plot(data, 'r-')
        ax.set_title('PyQt Matplotlib Example')
      ax.set_title("PyQt Matplotlib Example")
        self.draw()
      self.draw()
   
   
   
   
  if __name__ == '__main__':
  if __name__ == '__main__':
     app = QApplication(sys.argv)
     app = QApplication(sys.argv)
     ex = App()
     window = MainWindow()
    window.show()
     sys.exit(app.exec_())
     sys.exit(app.exec_())
  </source>
  </syntaxhighlight>
<br>
<br>
上記のサンプルコードを実行すると、コンソール上に次のような警告が出力される。(挙動自体に影響はないと思われる)<br>
上記のサンプルコードを実行すると、コンソール上に次のような警告が出力される。(挙動自体に影響はないと思われる)<br>
102行目: 101行目:
<br><br>
<br><br>


== Matplotlibで作成するグラフ ==
== Matplotlibで作成するグラフ (2) ==
上記のセクションにおいて、警告が出力される原因は、<code>add_subplot()</code>関数が2箇所に存在しているからである。<br>
上記のセクションにおいて、警告が出力される原因は、<code>add_subplot()</code>関数が2箇所に存在しているからである。<br>
<br>
これは、上記のサンプルコードでは、<code>PlotCanvas</code>クラスのコンストラクタと<code>plot</code>関数の中で、それぞれ<code>add_subplot()</code>関数を使用しており、<br>
上記のサンプルコードでは、<code>PlotCanvas</code>クラスのコンストラクタと<code>plot</code>関数の中で、それぞれ<code>add_subplot()</code>関数を使用している。<br>
axesに関わる変数を2回定義(重複)しているから警告が出力される。<br>
つまり、axesに関わる変数を2回定義(重複)しているから警告が出力される。<br>
<br>
<br>
したがって、まず、<code>plot</code>関数内にある以下の行を削除する。<br>
したがって、まず、<code>plot</code>関数内にある以下の行を削除する。<br>
  <source lang="python">
  <syntaxhighlight lang="python">
  ax = self.figure.add_subplot(111)
  ax = self.figure.add_subplot(111)
  </source>
  </syntaxhighlight>
<br>
<br>
次に、上記で削除した変数axが使用されている箇所を修正する。<br>
次に、上記で削除した変数axが使用されている箇所を修正する。<br>
128行目: 126行目:
以下のサンプルコードでは、警告が出力されないように修正を加え、上記の3つの機能を実装している。<br>
以下のサンプルコードでは、警告が出力されないように修正を加え、上記の3つの機能を実装している。<br>
なお、クラス名や変数名等は変更している箇所がある。<br>
なお、クラス名や変数名等は変更している箇所がある。<br>
  <source lang="python">
  <syntaxhighlight lang="python">
  # - * - coding: utf8 - *
  # - * - coding: utf8 - *
   
   
135行目: 133行目:
  import datetime
  import datetime
   
   
from PyQt5.QtCore import *
  from PyQt5.QtWidgets import *
  from PyQt5.QtWidgets import *
from PyQt5.QtCore import QTimer
   
   
  from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
  from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
146行目: 144行目:
  class plotGraph(QMainWindow):
  class plotGraph(QMainWindow):
   
   
     def __init__(self):
     def __init__(self, parent=None):
         super().__init__()
         super(plotGraph, self).__init__(parent)
         self.title  = "グラフを表示するウインドウ"
         self.title  = "グラフを表示するウインドウ"
         self.width  = 700
         self.width  = 700
196行目: 194行目:
         self.w.setLayout(main_layout)
         self.w.setLayout(main_layout)
         self.setCentralWidget(self.w)
         self.setCentralWidget(self.w)
        self.show()
   
   
   
   
236行目: 233行目:
     app = QApplication(sys.argv)
     app = QApplication(sys.argv)
     window = plotGraph()
     window = plotGraph()
    window.show()
     sys.exit(app.exec_())
     sys.exit(app.exec_())
   
   
241行目: 239行目:
  if __name__ == '__main__':
  if __name__ == '__main__':
     main()
     main()
  </source>
  </syntaxhighlight>
<br>
<br>
上記のサンプルコードを実行すると、下図のような画面が表示される。<br>
上記のサンプルコードを実行すると、下図のような画面が表示される。<br>
251行目: 249行目:
また、上記のサンプルコードでは、グラフで使用するデータを乱数で生成しているが、CSVファイル等を読み込み、グラフを描画することもできる。<br>
また、上記のサンプルコードでは、グラフで使用するデータを乱数で生成しているが、CSVファイル等を読み込み、グラフを描画することもできる。<br>
<br><br>
<br><br>
== 備考 ==
実務上において、画面に何らかの描画領域を埋め込む場合は、<br>
QGraphicsViewクラス、QGraphicsSceneクラス、QGraphicsItemクラスを組み合わせて使用することが多い。<br>
つまり、このページで作成したような構造でなくても、画面に描画領域を埋め込むことができる。<br>
<br>
PyQtには、数百を超えるクラスが存在しており、実現したい動作等、それぞれの要件に合わせて、より良い構成が存在する。<br>
<br><br>


__FORCETOC__
__FORCETOC__
[[カテゴリ:Python]]
[[カテゴリ:Python]]