我想在 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
:
然后我们通过右键单击并选择选项promoted to ...
来提升它:
得到下图所示,在Promoted Class Name
中我们将Canvas
作为类名,在Header File
中> 我们放置canvas.h
(在头文件中放置file.py
文件,例如package.subpackage.file.h
),然后按 Add
并在 Promote
之后:
最后我们得到一个类似下面的文件结构:
.
├── 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_())
最后我们得到如下结果:
您可以找到完整的项目 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))
...
关于python - 如何在 PyQt4 中使用 matplotlib,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45369725/