怎么在pyqt中显示matplotlib的绘图?

想要在pyqt中显示matplotlib的绘图,在绘图时,其实不必使用以下语句:

matplotlib.use("Qt5Agg")  # 声明使用QT5

最关键的语句是:

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg

FigureCanvasQTAgg是一个渲染器,它的工作就是不停的drawing,从而将物体显示在屏幕上。
在这里可以理解为将matplotlib中的figure对象变为一个Qt widgets.

QGraphicsView、QGraphicsProxyWidget和QGraphicsScene是Qt中用于实现2D图形界面的重要类。

  • QGraphicsView是用于显示场景和处理用户交互的窗口部件
  • QGraphicsScene是一个图形场景,它可以容纳和管理大量的2D图形项(QGraphicsItem)
  • QGraphicsProxyWidget则是将QWidget封装成为一个QGraphicsItem以便添加到QGraphicsScene中
import sys
from PyQt5.QtWidgets import QApplication, QGraphicsScene, QGraphicsView, QGraphicsProxyWidget, QPushButton
import numpy
import matplotlib 
import matplotlib.pyplot as plt
# 其中构造函数Figure()用来创建一个类似Matlab的figure()或matplotlib.pyplot的figure()
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg

# 自定义绘图类
class MyFigure(FigureCanvasQTAgg):  # 表示MyFigure 继承 FigureCanvasQTAgg
    """FigureCanvasQTAgg的最终的父类其实是QWidget。"""
    def __init__(self, parent=None):
        # 创建一个Figure对象
        self.fig = Figure(figsize=(10, 6), dpi=72)  # 新建一个figure
        # 在父类中激活Figure,同时继承父类属性
        # 此句必不可少,否则不能显示图形
        super(MyFigure,self).__init__(self.fig) # 执行父类的__init__函数,使得我们能够调用父类的init中的属性
        self.axes = self.fig.add_subplot(111)  # 建立一个子图,如果要建立复合图,可以在这里修改
        # plt.clf() # 每次绘图的时候,清除上一次的绘图


        # 创造数据
        numpy.random.seed(1)
        x = numpy.random.uniform(-3, 3, 256)
        y = numpy.random.uniform(-3, 3, 256)
        # 进行绘图
        self.axes.triplot(x, y)
        self.axes.set(xlim=(-3, 3), ylim=(-3, 3))
        
        self.fig.canvas.draw()   

if __name__ == "__main__":
    # 创建了一个QApplication实例
    app = QApplication(sys.argv)
    # QGraphicsScene是一个图形场景,它可以容纳和管理大量的2D图形项(QGraphicsItem)
    # 创建一个QGraphicsScene
    scene = QGraphicsScene()
    # 创建了一个QGraphicsView实例
    # QGraphicsView是用于显示绘图的窗口部件
    # 在绘图窗口中显示图形场景
    # 把QGraphicsScene添加到QGraphicsView中显示
    view = QGraphicsView(scene)

    # 实例化自定义的绘图
    myfig = MyFigure()
    # QGraphicsProxyWidget则是将QWidget封装成为一个QGraphicsItem
    # 以便添加到QGraphicsScene中
    proxy = QGraphicsProxyWidget()
    proxy.setWidget(myfig)
    """ 以上代码将myfig封装成为一个QGraphicsItem """
    # 将QGraphicsProxyWidget添加到场景中
    # 在场景中显示自定义的绘图
    scene.addItem(proxy)
    view.show()
    sys.exit(app.exec_())

以上代码中,首先我们创建了一个QApplication实例和一个QGraphicsScene实例。
然后创建了一个QPushButton实例作为QGraphicsProxyWidget的子控件
接着将自定义的绘图,封装成一个QGraphicsProxyWidget,并将其添加到场景QGraphicsScene中。
最后,我们创建了一个QGraphicsView实例,并将其设置为显示我们绘图的图片。
在这里插入图片描述

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

夏悠

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值