[英]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.