如何在 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))
...
我想在 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.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))
...