如何在 PyQt4 中使用 matplotlib

How to use matplotlib with PyQt4

我想在 PyQt 中使用嵌入式 matplotlib 绘制图形。 我主要使用 Qt Designer window,并为信号和槽连接部分编写 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 中设置 canvas 小部件,我仍在努力寻找位置错误在于我的代码。 非常感谢您的帮助,谢谢。

为了在 Qt Designer 中使用 matplotlib 不能直接完成,为此我们必须提升 QWidget 以使用 FigureCanvas 或更好的 class继承自它,如下所示,首先我们在名为 canvas.py:

的文件中创建一个名为 Canvas 的 class

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 创建设计后,我们拥有了所有想要的元素,但是我们要放置参数的地方使用 Containers 中的 Widget 元素,我们命名它 canvas:

然后我们通过右键点击升级它并选择选项promoted to ...:

得到下图所示,在Promoted Class Name中我们放置Canvas作为class的名称,在Header File中放置[=24] =](在头文件中放置 file.py 文件,例如 package.subpackage.file.h),然后按 Add 并在 Promote 之后:

最后我们得到一个类似于下面的文件结构:

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

然后我们创建文件 main.py,我们在其中放置您的代码,但有一些小的变化:

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_())

最后我们得到以下结果:

您可以找到完整的项目here


如果要添加 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))
        ...