首页 > 其他分享 >matplotlib嵌入到pyqt中

matplotlib嵌入到pyqt中

时间:2023-12-30 13:55:53浏览次数:28  
标签:__ 嵌入 self matplotlib QtWidgets pyqt import def

在pyqt5中使用matplotlib

前言

虽然,qt中也提供了绘图函数,但对于初学者并不是很容易掌握,众所周知,matplot提供了简单,易用,强大的绘图函数,结合mumpy基本可以达到matlb中的绘图体验,并且比matlab更加具有扩展性,也更自由。通过matplotlib提供的官方例程的修改,就可以很容易的绘制你想要的图形,真的很强大。(我也是名初学者)

matplotlib,pyqt5官方例程

# 取自matplotlib 官方文档案例

from __future__ import unicode_literals
import sys
import os
import random
import matplotlib
# Make sure that we are using QT5
matplotlib.use('Qt5Agg')

from PyQt5 import QtCore, QtWidgets
from numpy import arange, sin, pi, linspace
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure

progname = os.path.basename(sys.argv[0])
progversion = "0.1"


class MyMplCanvas(FigureCanvas):
    # 这既是一个wiget类也是一个FigureCanva

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

        self.compute_initial_figure()

        FigureCanvas.__init__(self, self.fig)
        self.setParent(parent)

        FigureCanvas.setSizePolicy(self,
                                   QtWidgets.QSizePolicy.Expanding,
                                   QtWidgets.QSizePolicy.Expanding)
        FigureCanvas.updateGeometry(self)

    def compute_initial_figure(self):
        pass


class MyStaticMplCanvas(MyMplCanvas):
    """Simple canvas with a sine plot."""

    def __init__(self, *args, **kwargs):
        MyMplCanvas.__init__(self, *args, **kwargs)
        

    def compute_initial_figure(self):
        print("hello world")
        x = linspace(0, 2 * pi, 500000)
        y = sin(x)
        self.axes.cla()
        self.axes.plot(x, y)
        self.draw()


class MyDynamicMplCanvas(MyMplCanvas):
    """A canvas that updates itself every second with a new plot."""

    def __init__(self, *args, **kwargs):
        MyMplCanvas.__init__(self, *args, **kwargs)
        timer = QtCore.QTimer(self)
        
        timer.timeout.connect(self.update_figure)
        timer.start(1000)

    def compute_initial_figure(self):
        self.axes.plot([0, 1, 2, 3], [1, 2, 0, 4], 'r')

    def update_figure(self):
        # Build a list of 4 random integers between 0 and 10 (both inclusive)
        l = [random.randint(0, 10) for i in range(4)]
        self.axes.cla()
        self.axes.plot([0, 1, 2, 3], l, 'r')
        self.draw()


class ApplicationWindow(QtWidgets.QMainWindow):
    def __init__(self):
        QtWidgets.QMainWindow.__init__(self)
        self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
        self.setWindowTitle("application main window")

        self.file_menu = QtWidgets.QMenu('&File', self)
        self.file_menu.addAction('&Quit', self.fileQuit,
                                 QtCore.Qt.CTRL + QtCore.Qt.Key_Q)
        self.menuBar().addMenu(self.file_menu)

        self.help_menu = QtWidgets.QMenu('&Help', self)
        self.menuBar().addSeparator()
        self.menuBar().addMenu(self.help_menu)

        self.help_menu.addAction('&About', self.about)

        self.main_widget = QtWidgets.QWidget(self)

        l = QtWidgets.QVBoxLayout(self.main_widget)
        sc = MyStaticMplCanvas(self.main_widget, width=5, height=4, dpi=100)
        dc = MyDynamicMplCanvas(self.main_widget, width=5, height=4, dpi=100)
        l.addWidget(sc)
        l.addWidget(dc)

        self.main_widget.setFocus()
        self.setCentralWidget(self.main_widget)

        self.statusBar().showMessage("All hail matplotlib!", 2000)

    def fileQuit(self):
        self.close()

    def closeEvent(self, ce):
        self.fileQuit()

    def about(self):
        QtWidgets.QMessageBox.about(self, "About",
                                    """embedding_in_qt5.py example
Copyright 2005 Florent Rougon, 2006 Darren Dale, 2015 Jens H Nielsen

This program is a simple example of a Qt5 application embedding matplotlib
canvases.

It may be used and modified with no restriction; raw copies as well as
modified versions may be distributed without limitation.

This is modified from the embedding in qt4 example to show the difference
between qt4 and qt5""")

 

代码解析

通过matplotlib.use('Qt5Agg'),这行代码声明matplotlib将要嵌入到pyqt5中,同样通过这句,也可以声明将matplotlib嵌入到其他的,gui界面中去,然后通过继承FigureCanvas类来获得一个即使widget的类也是FigureCanva类的类,然后通过self.fig成员,生成一个绘图类,并由其创建一个绘图布局,返回一个self.axes来管理绘图布局中的内容。坐标轴,标题,标签,图形样式(饼图,柱状图,折线图等)等等的设置都通过self.axes的成员函数来设置完成。刚开始的使用还是比较云里雾里的,现在就差不多了。我对官方例程做了些修改,具体的代码,可以到我的GitHub仓储上查看Qt-learn-pyqt5-matplotlib里面也有一些其他的例子,应该还会不定期的更新,有兴趣也可以看看。下面只需要对这几个类进行实例话,开启qt的事件循环就可以看到界面了,具体的可以看我的github代码,这里就不多说了。

写在最后

因为自身能力有限,也不是科班出身,都是自学的,目前还是一名学生,所以有未尽之处还请指正,不喜勿喷。谢谢。

 

https://segmentfault.com/a/1190000016326347

标签:__,嵌入,self,matplotlib,QtWidgets,pyqt,import,def
From: https://www.cnblogs.com/liylllove/p/17936295.html

相关文章

  • MacOS - QT动态库打包嵌入问题处理
    Crash信息TerminationReason:NamespaceDYLD,Code1LibrarymissingLibrarynotloaded:@rpath/QtCore.framework/Versions/5/QtCoreReferencedfrom:/Applications/AppName.app/Contents/MacOS/AppNameReason:tried:'/Applications/AppName.app/Contents/MacOS/......
  • numpy、scipy、pandas、matplotlib的读书报告
    numpy、scipy、pandas、matplotlib的读书报告一、numpy的读书报告1Numpy概述1.1概念Numpy提供了两种基本的对象:ndarray和ufunc。Ndarray是存储单一数据类型的多维数组,而ufunc则是能够对数组进行处理的函数。1.2功能l  创建n维数组(矩阵)l  对数组进行函数运算,使用函......
  • numpy、scipy、pandas、matplotlib的读书报告07
    numpy库常用的创建数组(ndarray类型)使用实例:importnumpyasnpa=np.ones((4,5))#创建一个4行5列全是1的数组print(a)输出为:[[1.1.1.1.1.][1.1.1.1.1.][1.1.1.1.1.][1.1.1.1.1.]] matplotlib.pyplot为matplotlib的子库引用如下:importma......
  • Matplotlib读书报告
    1.Matplotlib简介  Matplotlib是Python的一个2D图形库,能够生成各种格式的图形(诸如折线图,散点图,直方图等等),界面可交互(可以利用鼠标对生成图形进行点击操作),同时该2D图形库跨平台,即既可以在Python脚本中编码操作,也可以在JupyterNotebook中使用,以及其他平台都可以很方便的使用Ma......
  • numpy、scipy、pandas、matplotlib的读书报告
    Numpy:基础的数学计算模块,以矩阵为主,纯数学。SciPy:基于Numpy,提供方法(函数库)直接计算结果,封装了一些高阶抽象和物理模型。比方说做个傅立叶变换,这是纯数学的,用Numpy;做个滤波器,这属于信号处理模型了,在Scipy里找。Pandas:提供了一套名为DataFrame的数据结构,适合统计分析中的......
  • 痞子衡嵌入式:简析i.MXRT1170 MECC64功能特点及其保护片内OCRAM1,2之道
    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是i.MXRT1170MECC64功能特点及其保护片内OCRAM1,2之道。ECC是“ErrorCorrectingCode”的简写,ECC能够实现错误检查和纠正,含有ECC功能的内存一般称为ECC内存,使用了ECC内存的系统在稳定性和可靠性......
  • numpy、scipy、pandas、matplotlib的读书报告:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪
    1、基本函数用法Numpy:基础的数学计算模块,来存储和处理大型矩阵,比Python自身的嵌套列表(nestedliststructure)结构要高效的多,本身是由C语言开发。这个是很基础的扩展,其余的扩展都是以此为基础。数据结构为ndarray,一般有三种方式来创建。Scipy:方便、易于使用、专为科学和工程......
  • 嵌入式教学实验箱_数字信号处理实验箱_操作教程:5-16 灰度图像线性变换(LCD显示)
    一、实验目的学习灰度图像线性变换的原理,掌握图像的读取方法,并实现在LCD上显示线性变换前后的图像。二、实验原理图像线性变换一般成像系统只具有一定的亮度范围,亮度的最大值与最小值之比称为对比度。由于形成图像的系统亮度有限,常出现对比度不足的弊病,使人眼观看图像时视觉效果很......
  • 如何写出高效清晰的嵌入式C程序
    作为嵌入式工程师,怎么写出效率高、思路清晰的C语言程序呢?要用C语言的思维方式来进行程序的构架构建要有良好的C语言算法基础,以此来实现程序的逻辑构架灵活运用C语言的指针操作虽然看起来以上的说法很抽象,给人如坠雾里的感觉,其实就是用C语言进行遇到问题、分析问题和解决问题的过程......
  • 嵌入式的485总线介绍和应用
    在嵌入式系统中,通信是不可或缺的一部分,而RS-485总线协议因其长距离传输、多设备连接、抗干扰等特点,在工业自动化等领域得到广泛应用。本文将介绍RS-485总线的基本原理、特点以及在嵌入式系统中的应用,并提供详细的代码演示,帮助读者理解和应用RS-485总线。1.RS-485总线的基本原理RS-......