簡體   English   中英

如何在 PyQt4 中使用 matplotlib

[英]How to use matplotlib with PyQt4

我想在 PyQt 中繪制一個帶有嵌入式 matplotlib 的圖形。 我在主窗口使用 Qt Designer,並為信號和插槽連接部分編寫 python 代碼。

所以我的代碼是這樣的:

import sys
from PyQt4 import QtCore, QtGui, uic
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas 
from matplotlib.backends.backend_qt4agg import NavigationToolbar2QT as NavigationToolbar
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np


qtCreatorFile = "main.ui" # my Qt Designer file 

Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile)

class MyApp(QtGui.QMainWindow, Ui_MainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        Ui_MainWindow.__init__(self)
        self.setupUi(self)

        self.figure = plt.figure()

        self.canvas = FigureCanvas(self.figure)

        self.csvbutton.clicked.connect(self.plot)

    def plot(self):

        filePath="/path to csv file here"
        df= pd.read_csv(str(filePath),index_col='date')
        df.index = pd.to_datetime(df.index, unit='s')
        ax = self.figure.add_subplot(111)
        ax.hold(False)
        ax.plot(df, '*-')
        self.canvas.draw()



if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    window = MyApp()
    window.show()
    sys.exit(app.exec_())

我的主要問題是 Qt Designer 文件和 python 代碼之間的連接,我無法直接在 Qt Designer 中設置畫布小部件,而且我仍在努力尋找錯誤在我的代碼中的位置。 非常感謝您的幫助,謝謝。

為了在 Qt Designer 中使用matplotlib不能直接完成,為此我們必須提升一個QWidget以使用FigureCanvas或更好的繼承自它的類,如下所示,首先我們在名為 canvas.py 的文件中創建一個名為 Canvas 的類:

畫布.py

from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas 
import matplotlib.pyplot as plt

class Canvas(FigureCanvas):
    def __init__(self, parent=None):
        self.figure = plt.figure()
        FigureCanvas.__init__(self, self.figure)
        self.setParent(parent)

通過 Qt Designer 創建設計后,我們擁有了我們想要的所有元素,但是在我們想要放置參數的地方我們使用了ContainersWidget元素,我們將其命名為canvas

在此處輸入圖片說明

然后我們通過右鍵單擊來提升它並選擇promoted to ...的選項:

在此處輸入圖片說明

獲得下圖所示的內容,在Promoted Class Name我們放置Canvas作為Promoted Class Name ,在Header File放置canvas.h (在Header File中放置file.py文件,例如package.subpackage.file.h ),然后按AddPromote

在此處輸入圖片說明

最后我們得到一個類似於以下的文件結構:

.
├── canvas.py
└── main.ui

然后我們創建文件 main.py,我們將您的代碼放置在其中,並帶有一些小的變化:

主文件

import matplotlib
matplotlib.use('Qt4Agg')

import sys
from PyQt4 import QtCore, QtGui, uic
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np


qtCreatorFile = "main.ui" # my Qt Designer file 

Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile)

class MyApp(QtGui.QMainWindow, Ui_MainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        Ui_MainWindow.__init__(self)
        self.setupUi(self)
        self.csvbutton.clicked.connect(self.plot)

    def plot(self):

        filePath="data.csv"
        df= pd.read_csv(str(filePath),index_col='date')
        ax = self.canvas.figure.add_subplot(111)
        ax.hold(False)
        ax.plot(df, '*-')
        self.canvas.draw()



if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    window = MyApp()
    window.show()
    sys.exit(app.exec_())

最終我們得到以下結果:

在此處輸入圖片說明

你可以在這里找到完整的項目


如果要添加 NavigationToolbar,可以使用以下代碼:

...
from matplotlib.backends.backend_qt4agg import NavigationToolbar2QT as NavigationToolbar 

...

class MyApp(QtGui.QMainWindow, Ui_MainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        Ui_MainWindow.__init__(self)
        self.setupUi(self)
        self.addToolBar(NavigationToolbar(self.canvas, self))
        ...

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM