问题
我们单独使用matplotlib工具包去画图,一般会使用import pyplot as plt
和 plt.show()
去显示图片。但如果程序是一个pyqt5的工具,它本身就有一个界面,这时用plt.show()
去弹出一个额外的界面,用户交互会显得很不友好。
其实,我们可以把matplotlib画出来的图像嵌入到pyqt的界面窗口里。
方案
主要是使用matplotlib中的FigureCanvasQTAgg
和Figure
,还有NavigationToolbar2QT
。
下面举例,看代码
import sys
from matplotlib.backends.backend_qt5 import NavigationToolbar2QT
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QGridLayout
class MyFigureCanvas(FigureCanvas):
"""
画布
"""
def __init__(self):
# 画布上初始化一个图像
self.figure = Figure()
super().__init__(self.figure)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.widget = QWidget(self)
# 设置中心窗口
self.setCentralWidget(self.widget)
# 创建一个网格布局管理器
self.layout = QGridLayout()
self.figureCanvas = MyFigureCanvas()
self.__draw_figure__()
# 工具栏 用于操作图片
self.navigationToolbar = NavigationToolbar2QT(self.figureCanvas, self)
self.layout.addWidget(self.navigationToolbar, 0, 0, 1, 1)
self.layout.addWidget(self.figureCanvas, 1, 0, 1, 1)
self.widget.setLayout(self.layout)
self.setGeometry(300, 300, 500, 500)
self.setWindowTitle('figure嵌入pyqt界面样例')
self.show()
def __draw_figure__(self):
# 下面的步骤和调用的方法和plot大致相同,这里我写一个简单的折线图
self.axes = self.figureCanvas.figure.add_subplot(111)
self.axes.set_title("line chart")
self.axes.set_xlabel("x")
self.axes.set_ylabel("y")
x = range(2, 26, 2)
y = [15, 13, 14.5, 17, 20, 25, 26, 26, 27, 22, 18, 15]
self.axes.plot(x, y, color='red')
if __name__ == "__main__":
app = QApplication(sys.argv)
example = MainWindow()
example.show()
sys.exit(app.exec_())
效果截图: