如何在 PyQt 应用程序中嵌入 Matplotlib 图

许多其他 Python 库——例如seabornpandas——利用 Matplotlib 后端进行绘图。这些绘图可以以与此处所示相同的方式嵌入到 PyQt5 中,并且在绘图时传递对轴的引用

安装 Matplotlib

如果没有安装,您可以使用 Pip 正常安装它,使用以下命令 -

pip install matplotlib

一个简单的例子

import sys
import matplotlib
matplotlib.use('Qt5Agg')

from PyQt5 import QtCore, QtWidgets

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg
from matplotlib.figure import Figure


class MplCanvas(FigureCanvasQTAgg):
	"""
	figure 模块提供了顶级 Artist,即 Figure,其中包含所有绘图元素。
	该模块用于控制所有绘图元素的子图和顶级容器的默认间距
	使用的目的plt.figure()是创建一个图形对象。
	整个图形被视为图形对象。当我们想要调整图形的大小以及想要在单个图形中添加多个 Axes 对象时,
	必须显式使用
	add_subplot添加一个绘图区作为子图排列的一部分,网格“111”表示“1x1 网格,第一个子图
	"""
    def __init__(self, parent=None, width=5, height=4, dpi=100):
        fig = Figure(figsize=(width, height), dpi=dpi)
        self.axes = fig.add_subplot(111)
        super(MplCanvas, self).__init__(fig)


class MainWindow(QtWidgets.QMainWindow):

    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)

        # 创建 maptlotlib FigureCanvas 对象,
        # 绘制二维坐标轴.
        sc = MplCanvas(self, width=5, height=4, dpi=100)
        sc.axes.plot([0,1,2,3,4], [10,1,20,3,40])
        self.setCentralWidget(sc)

        self.show()


app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
app.exec_()

在这里插入图片描述

带有绘图控件

import sys
import matplotlib
matplotlib.use('Qt5Agg')

from PyQt5 import QtCore, QtGui, QtWidgets

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg, NavigationToolbar2QT as NavigationToolbar
from matplotlib.figure import Figure


class MplCanvas(FigureCanvasQTAgg):

    def __init__(self, parent=None, width=5, height=4, dpi=100):
        fig = Figure(figsize=(width, height), dpi=dpi)
        self.axes = fig.add_subplot(111)
        super(MplCanvas, self).__init__(fig)


class MainWindow(QtWidgets.QMainWindow):

    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)

        sc = MplCanvas(self, width=5, height=4, dpi=100)
        sc.axes.plot([0,1,2,3,4], [10,1,20,3,40])

        # 创建工具栏,将canvas作为第一个参数,parent (self,MainWindow) 作为第二个参数
        toolbar = NavigationToolbar(sc, self)

        layout = QtWidgets.QVBoxLayout()
        layout.addWidget(toolbar)
        layout.addWidget(sc)

        # 创建一个占位小部件来放置固定工具栏和画布.
        widget = QtWidgets.QWidget()
        widget.setLayout(layout)
        self.setCentralWidget(widget)

        self.show()


app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
app.exec_()

在这里插入图片描述

清除重绘

import sys
import random
import matplotlib
matplotlib.use('Qt5Agg')

from PyQt5 import QtCore, QtWidgets

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure


class MplCanvas(FigureCanvas):

    def __init__(self, parent=None, width=5, height=4, dpi=100):
        fig = Figure(figsize=(width, height), dpi=dpi)
        self.axes = fig.add_subplot(111)
        super(MplCanvas, self).__init__(fig)


class MainWindow(QtWidgets.QMainWindow):

    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)

        self.canvas = MplCanvas(self, width=5, height=4, dpi=100)
        self.setCentralWidget(self.canvas)

        n_data = 50
        self.xdata = list(range(n_data))
        self.ydata = [random.randint(0, 10) for i in range(n_data)]
        self.update_plot()

        self.show()

        # 通过调用 update_plot 设置定时器进行定时重绘.
        self.timer = QtCore.QTimer()
        self.timer.setInterval(100)
        self.timer.timeout.connect(self.update_plot)
        self.timer.start()

    def update_plot(self):
        # 移除y的一个数据, 添加一个新的数据.
        self.ydata = self.ydata[1:] + [random.randint(0, 10)]
        self.canvas.axes.cla()  # Clear the canvas.
        self.canvas.axes.plot(self.xdata, self.ydata, 'r')
        # 触发画布更新和重绘.
        self.canvas.draw()


app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
app.exec_()

在这里插入图片描述

动态原地更新

import sys
import random
import matplotlib
matplotlib.use('Qt5Agg')

from PyQt5 import QtCore, QtWidgets

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure


class MplCanvas(FigureCanvas):

    def __init__(self, parent=None, width=5, height=4, dpi=100):
        fig = Figure(figsize=(width, height), dpi=dpi)
        self.axes = fig.add_subplot(111)
        super(MplCanvas, self).__init__(fig)


class MainWindow(QtWidgets.QMainWindow):

    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)

        self.canvas = MplCanvas(self, width=5, height=4, dpi=100)
        self.setCentralWidget(self.canvas)

        n_data = 50
        self.xdata = list(range(n_data))
        self.ydata = [random.randint(0, 10) for i in range(n_data)]
		
		# 只需要一个附加变量检索对绘制线的引用
        self._plot_ref = None
        self.update_plot()
        self.show()

        # 通过调用 update_plot 设置定时器进行定时重绘.
        self.timer = QtCore.QTimer()
        self.timer.setInterval(100)
        self.timer.timeout.connect(self.update_plot)
        self.timer.start()

    def update_plot(self):
        # 移除y的一个数据, 添加一个新的数据.
        self.ydata = self.ydata[1:] + [random.randint(0, 10)]

        # 注意: 不需要清除y的数据.
        if self._plot_ref is None:
            # 第一次进来self._plotref是None(即没有画线)
            # 然后画线并赋值给self._plot_ref
            # plot返回的是一个包含一个线条的列表
            plot_refs = self.canvas.axes.plot(self.xdata, self.ydata, 'r')
            self._plot_ref = plot_refs[0]
        else:
            # 通过设置更新Y self._plot_ref.set_ydata(self.ydata)
            self._plot_ref.set_ydata(self.ydata)

        # 更新画布.
        self.canvas.draw()


app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
app.exec_()

在这里插入图片描述

  • 6
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 在PyQt5嵌入Matplotlib可以通过使用Qt的QWidget类和Matplotlib的FigureCanvasQTAgg类来实现。具体步骤如下: 1. 导入必要的模块: ```python from PyQt5.QtWidgets import QApplication, QMainWindow, QSizePolicy, QVBoxLayout, QWidget from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas from matplotlib.figure import Figure ``` 2. 创建一个继承自QMainWindow的类,并在其创建一个QWidget对象作为主窗口的心部件: ```python class MainWindow(QMainWindow): def __init__(self): super().__init__() # 创建一个QWidget对象作为主窗口的心部件 central_widget = QWidget(self) self.setCentralWidget(central_widget) ``` 3. 在QWidget对象创建一个FigureCanvas对象,并将其添加到一个垂直布局: ```python class MainWindow(QMainWindow): def __init__(self): super().__init__() # 创建一个QWidget对象作为主窗口的心部件 central_widget = QWidget(self) self.setCentralWidget(central_widget) # 创建一个FigureCanvas对象 self.figure = Figure() self.canvas = FigureCanvas(self.figure) # 将FigureCanvas对象添加到一个垂直布局 layout = QVBoxLayout(central_widget) layout.addWidget(self.canvas) ``` 4. 在Figure对象绘制形: ```python class MainWindow(QMainWindow): def __init__(self): super().__init__() # 创建一个QWidget对象作为主窗口的心部件 central_widget = QWidget(self) self.setCentralWidget(central_widget) # 创建一个FigureCanvas对象 self.figure = Figure() self.canvas = FigureCanvas(self.figure) # 将FigureCanvas对象添加到一个垂直布局 layout = QVBoxLayout(central_widget) layout.addWidget(self.canvas) # 在Figure对象绘制形 ax = self.figure.add_subplot(111) ax.plot([1, 2, 3, 4, 5], [1, 4, 9, 16, 25]) ax.set_title('My Plot') self.canvas.draw() ``` 完整的代码如下: ```python from PyQt5.QtWidgets import QApplication, QMainWindow, QSizePolicy, QVBoxLayout, QWidget from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas from matplotlib.figure import Figure class MainWindow(QMainWindow): def __init__(self): super().__init__() # 创建一个QWidget对象作为主窗口的心部件 central_widget = QWidget(self) self.setCentralWidget(central_widget) # 创建一个FigureCanvas对象 self.figure = Figure() self.canvas = FigureCanvas(self.figure) # 将FigureCanvas对象添加到一个垂直布局 layout = QVBoxLayout(central_widget) layout.addWidget(self.canvas) # 在Figure对象绘制形 ax = self.figure.add_subplot(111) ax.plot([1, 2, 3, 4, 5], [1, 4, 9, 16, 25]) ax.set_title('My Plot') self.canvas.draw() if __name__ == '__main__': app = QApplication([]) window = MainWindow() window.show() app.exec_() ``` ### 回答2: PyQt5是一个强大的Python框架,它允许用户轻松地构建形用户界面(GUI)。同时,Matplotlib是一种灵活和广泛使用的绘库,它可以创建各种类型的,并为科学家、工程师和数据科学家提供了重要的可视化支持。在本文,我们将讨论如何在PyQt5嵌入Matplotlib。 步骤1:安装MatplotlibPyQt5库 要在PyQt5使用Matplotlib,首先需要安装两个库。可以使用pip安装这两个库: $ pip install matplotlib $ pip install PyQt5 步骤2:创建一个PyQt5窗口 要在窗口嵌入Matplotlib,首先需要创建一个PyQt5窗口。可以使用以下代码创建一个基本的窗口,或者根据需要进行修改: import sys from PyQt5.QtWidgets import QApplication, QMainWindow class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("My PyQt5 App") self.setGeometry(100, 100, 800, 600) self.show() if __name__ == '__main__': app = QApplication(sys.argv) mainWindow = MainWindow() sys.exit(app.exec_()) 步骤3:添加一个Matplotlib形 要在窗口嵌入Matplotlib形,需要使用FigureCanvasQTAgg类。该类可以将Matplotlib嵌入PyQt5窗口。以下是如何将形添加到窗口的代码: import matplotlib.pyplot as plt from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas class MatplotlibWidget(FigureCanvas): def __init__(self, parent=None, width=5, height=4, dpi=100): fig = plt.Figure(figsize=(width, height), dpi=dpi) self.axes = fig.add_subplot(111) super(MatplotlibWidget, self).__init__(fig) 注意,Matplotlib形必须添加到Figure类。可以使用Figure类的各种方法和属性控制形的格式和内容。 步骤4:在PyQt5窗口显示形 为了在窗口显示Matplotlib形,需要将Matplotlib小部件添加到PyQt5窗口。可以使用addwidget()方法将Matplotlib小部件添加到PyQt5窗口。 以下是将Matplotlib形添加到PyQt5窗口的代码: class MainWindow(QMainWindow): ... def init_mpl_widget(self): self.mplwidget = MatplotlibWidget(self) self.setCentralWidget(self.mplwidget) ... 在init_mpl_widget()方法,创建MatplotlibWidget对象并将其添加到心窗口部件。 现在就可以向Matplotlib添加数据并在PyQt5窗口显示该数据了。 总结: 在PyQt5嵌入Matplotlib,是一个非常有用的技能,因为它允许用户通过创建GUI来轻松地可视化数据。上述是一个基本的步骤和代码示例,仅供参考。用户可以根据自己的需求和Matplotlib形更改代码,以根据自己的需求自定义PyQt5应用程序。 ### 回答3: PyQt5是Python的GUI编程工具包,MatplotlibPython常用的可视化工具,两者结合使用可以使得我们的GUI应用程序能够进行高效的数据可视化。本文将介绍如何在PyQt5嵌入Matplotlib。 一、安装库 在使用PyQt5和Matplotlib之前,需要先安装这两个库。可以使用pip命令进行安装: pip install PyQt5 pip install matplotlib 安装完成后,就可以开始使用这两个库了。 二、创建布局 使用PyQt5创建GUI应用程序需要先设计应用程序的布局。在本例,我们要在GUI界面嵌入Matplotlib区域,因此需要在布局添加一个QWidget并设置它的布局方式为QVBoxLayout。然后将一个QToolBox添加到这个QWidget。 三、创建Matplotlib区域 在QToolBox添加一个QFrame,并设置其布局方式为QVBoxLayout。然后添加一个FigureCanvasQTAgg作为这个QFrame的子控件。 四、绘制形 在Matplotlib区域,我们可以使用Matplotlib提供的各种函数来绘制我们需要的形。例如: fig = matplotlib.figure.Figure(figsize=(5, 5), dpi=100) ax = fig.add_subplot(111) ax.plot([0, 1, 2, 3, 4], [0, 3, 1, 5, 2]) canvas = FigureCanvasQTAgg(fig) self.ui.plot.addWidget(canvas) 这段代码创建一个size为5*5、dpi为100的新Figure,添加一个Axes对象,并在该对象上使用plot函数绘制了一条y轴坐标为[0, 3, 1, 5, 2],x轴坐标为[0, 1, 2, 3, 4]的线。最后将FigureCanvasQTAgg对象添加到布局。 五、显示GUI应用程序 完成所有布局和形绘制后,我们可以使用app.exec_()将窗口显示出来,代码如下: if __name__ == '__main__': app = QApplication(sys.argv) MainWindow = QMainWindow() ui = Ui_MainWindow() ui.setupUi(MainWindow) fig = matplotlib.figure.Figure(figsize=(5, 5), dpi=100) ax = fig.add_subplot(111) ax.plot([0, 1, 2, 3, 4], [0, 3, 1, 5, 2]) canvas = FigureCanvasQTAgg(fig) ui.plot.addWidget(canvas) MainWindow.show() sys.exit(app.exec_()) 通过这些步骤,我们就可以在PyQt5嵌入Matplotlib,绘制我们需要的形并显示在GUI应用程序

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ko-walski

太难了,求鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值