python - 如何在 PyQt4 中使用 matplotlib

标签 python matplotlib pyqt pyqt4 qt-designer

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

最佳答案

为了不能直接在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 创 build 计后,我们拥有了所有想要的元素,但是我们想要放置参数的地方使用 Containers 中的 Widget 元素, 我们将其命名为 canvas:

enter image description here

然后我们通过右键单击并选择选项promoted to ...来提升它:

enter image description here

得到下图所示,在Promoted Class Name中我们将Canvas作为类名,在Header File中> 我们放置canvas.h(在头文件中放置file.py文件,例如package.subpackage.file.h),然后按 Add 并在 Promote 之后:

enter image description here

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

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

然后我们创建文件 main.py,我们将您的代码与小的变化放在一起:

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

最后我们得到如下结果:

enter image description here

您可以找到完整的项目 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))
        ...

enter image description here

关于python - 如何在 PyQt4 中使用 matplotlib,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45369725/

相关文章:

python - 用Python下载的图片损坏了?

Python:检查数据文件是否相对于源代码文件存在

Python lxml getpath错误

python - 在Matplotlib中模拟Excel的 "scatter with smooth curve"样条函数3分

python - 在我的 tablewidget 中添加一个组合框

python - PyQt4 线程正确

python - 在Python中从字典列表构建深度嵌套字典的最有效方法

python - matplotlib pyplot : subplot size

python - 使用 DataFrame.plot 制作带子图的图表 -- 如何使用 ax 参数

python - 如何将 QListWidget 滚动到所选项目