【问题标题】:How to use matplotlib with PyQt4如何在 PyQt4 中使用 matplotlib
【发布时间】:2018-01-04 07:13:25
【问题描述】:

我想在 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 中设置画布小部件,而且我仍在努力寻找错误在我的代码中的位置。 非常感谢您的帮助,谢谢。

【问题讨论】:

  • 如果您没有在设计器中设置画布,那么在当前状态下,您的 self.canvas 不会包含在窗口的任何布局中。试试这个:在设计器中,在您想要放置画布的地方(QWidget、Groupbox 等)制作一个类似对象的容器。在代码中构建您的画布,将其添加到本地布局(例如QHBoxLayout)并在您的容器中创建一个.setLayout(canvaslayout)。这应该将您的画布正确放置在 UI 中。
  • 你得到什么错误?

标签: python matplotlib pyqt pyqt4 qt-designer


【解决方案1】:

为了在 Qt Designer 中不能直接使用matplotlib,为此我们必须提升一个QWidget 以使用FigureCanvas 或更好的继承自它的类,如下所示,首先我们创建一个在名为 canvas.py 的文件中名为 Canvas 的类:

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作为类名,Header File中我们放置canvas.h(在Header File中放置file.py文件,例如package.subpackage.file.h),然后按AddPromote 之后:

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

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

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

ma​​in.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))
        ...

【讨论】:

  • 感谢您的回答,这正是我需要知道的。
猜你喜欢
  • 2017-11-23
  • 2016-12-25
  • 1970-01-01
  • 2011-06-02
  • 1970-01-01
  • 1970-01-01
  • 2013-09-03
  • 2018-05-10
  • 1970-01-01
相关资源
最近更新 更多