[英]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 创建设计后,我们拥有了我们想要的所有元素,但是在我们想要放置参数的地方我们使用了Containers
的Widget
元素,我们将其命名为canvas
:
然后我们通过右键单击来提升它并选择promoted to ...
的选项:
获得下图所示的内容,在Promoted Class Name
我们放置Canvas
作为Promoted Class Name
,在Header File
放置canvas.h
(在Header File中放置file.py
文件,例如package.subpackage.file.h
),然后按Add
后Promote
:
最后我们得到一个类似于以下的文件结构:
.
├── 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.