【PyQt】在PyQt5的界面上集成matplotlib绘制的图像

文章目录

    • 0 前期教程
    • 1 概述
    • 2 matplotlib
      • 2.1 库导入
      • 2.2 图片的各个部分解释
      • 2.3 代码风格
      • 2.4 后端
    • 3 集成matplotlib图像到pyqt界面中
      • 3.1 使用到的模块
      • 3.2 理解Qt Designer中的“控件提升”
      • 3.3 界面与逻辑分离的思路
      • 3.4 扩展

0 前期教程

  • 【PyQt】PyQt5进阶——串口上位机及实时数据显示

1 概述

  在上面的前期教程中,介绍了在PyQt5中如何绘制曲线,是使用PyQt5的一些第三方扩展包来实现的,但是提到python中的画图,matplotlib才是最受欢迎的工具,因此,在PyQt5界面中集成一个matplotlib绘制的图非常有用。

2 matplotlib

  在开始之前,我们先来系统地复习一下matplotlib这个库。学习一个库,首先要参考的肯定是官网——https://matplotlib.org/stable/

  如果使用这个库较多,强烈建议完整看一遍Quick start guide,这样会对这个库有一个整体的认识,也更利于理解他人的代码。以下内容也基本摘自该教程。

2.1 库导入

  首先是库导入,一般采用以下这种方式:

import matplotlib.pyplot as plt
import numpy as np

import matplotlib as mpl

注意:在一些比较老的代码中,可能会看到import matplotlib.pylab as plt这样的代码,这个pylab是已经被弃用的库。

2.2 图片的各个部分解释

  在绘制一些相对复杂的图时,首先要理解一张图片中各个部分分别对应什么,这样更便于使用对应的函数以及查找相关的资料。以下这张图也摘自官网,详细介绍了一张图的各个部分及其对应的类和函数,非常详细,值得反复阅读。

在这里插入图片描述
注意,这里的ax来自以下代码:

fig, ax = plt.subplots()  # Create a figure containing a single axes.
ax.plot([1, 2, 3, 4], [1, 4, 2, 3])  # Plot some data on the axes.

2.3 代码风格

  在绘制图像方面,主要有两种常用的类型。分为显式接口(explicit interfaces)隐式接口(implicit interfaces),其中,所谓显式接口是使用面向对象的方式(object-oriented (OO) style);而隐式接口则是使用pyplot这个模块隐式地创建和管理图像和坐标轴等对象,即只使用pyplot里面的函数即可。

  • 显式接口

    x = np.linspace(0, 2, 100)  # Sample data.
    
    # Note that even in the OO-style, we use `.pyplot.figure` to create the Figure.
    fig, ax = plt.subplots(figsize=(5, 2.7), layout='constrained')
    ax.plot(x, x, label='linear')  # Plot some data on the axes.
    ax.plot(x, x**2, label='quadratic')  # Plot more data on the axes...
    ax.plot(x, x**3, label='cubic')  # ... and some more.
    ax.set_xlabel('x label')  # Add an x-label to the axes.
    ax.set_ylabel('y label')  # Add a y-label to the axes.
    ax.set_title("Simple Plot")  # Add a title to the axes.
    ax.legend()  # Add a legend.
    plt.show()   # display
    

在这里插入图片描述

  • 隐式接口

    x = np.linspace(0, 2, 100)  # Sample data.
    
    plt.figure(figsize=(5, 2.7), layout='constrained')
    plt.plot(x, x, label='linear')  # Plot some data on the (implicit) axes.
    plt.plot(x, x**2, label='quadratic')  # etc.
    plt.plot(x, x**3, label='cubic')
    plt.xlabel('x label')
    plt.ylabel('y label')
    plt.title("Simple Plot")
    plt.legend()
    plt.show()   # display
    

在这里插入图片描述

图片绘制方面,还有更丰富的一些设置,如设置线的样式(styling),或者在图片上增加标注(labelling)等,具体建议参考官网的教程。

2.4 后端

  所谓后端(backends),和网页的前端后端我认为概念上类似,但又有点区别,简而言之,对画图而言,前端即是画什么样的图,而后端则是在哪画图,即显示在哪

  根据官网的教程,matplotlib内部有多种后端可供选择,如Qt,GTK,wxWidgets,OSX,Tk等,分别对应的代码为:qtagg, GTK4Agg, GTK3Agg, wxAgg, macosx, TkAgg。此外,它还支持非内置的后端。
  指定后端的方式有三种:

  • 在 matplotlibrc 文件中设置 rcParams["backend"],如backend : qtagg
  • 在shell中设置 MPLBACKEND 环境变量,如在Windows端执行这个代码 set MPLBACKEND=qtagg
  • 在python脚本中增加代码:import matplotlib matplotlib.use('qtagg')

  很显然,在Windows上集成图像到Qt界面上最简单的办法就是第三种。

3 集成matplotlib图像到pyqt界面中

3.1 使用到的模块

  在大部分的教程中,一般都会有这样几行代码:

import matplotlib as mpl
mpl.use('Qt5Agg')
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure

其中,前两行是指定后端,第三行导入的FigureCanvasQTAgg实际上也是一个Qt的控件,也可以像一般的控件一样添加到Qt的窗口中,它相当于是一个画布,并不直接画图;而第四行导入的figure就是图像本身了,用于画图的各种操作。

3.2 理解Qt Designer中的“控件提升”

  控件提升操作在上面的前期教程中也有使用过,但是当时并没有对此理解很深入,只知道这样做而已。经过对比转换得到的py代码,发现所谓的控件提升,其实就是替换,即将放置的控件替换为其他的Qt控件,比如之前的QChartView和这里的FigureCanvasQTAgg,都是Qt控件,所以可以直接替换。原控件的作用主要设置布局和大小等外部特性。

  可以自行尝试一下,拖动一个widget到窗口,然后将其提升,内容可以随便写,再转换成python代码,观察填写的内容在实际代码中的体现。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

从上面的实践可以看出,实际上被提升的控件是什么类型并不重要,只要可以提升就行。常用的有Qwidget,QFrame等。

3.3 界面与逻辑分离的思路

  之所以要介绍上述的控件提升,就是为在集成matplotlib图像到pyqt界面过程中也保持界面和逻辑分离的状态
  为了实现这一目标,首先建立一个文件,命名为FigureCanvas.py(可以随便取),写入以下代码:

import matplotlib as mpl
mpl.use('Qt5Agg')
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure

class MyFigure(FigureCanvas):
    def __init__(self, parent=None):
        self.fig = Figure()
        super().__init__(self.fig)
        self.axes = self.fig.add_subplot(111)

    def plot(self, *args, **kwargs):
        self.axes.clear()                 # 清除之前的图像
        self.axes.plot(*args, **kwargs)   # 画图
        self.fig.canvas.draw()            # 刷新画布

可以看到,内容非常简单,就是在前面介绍的头文件基础上,新建了一个类而已,这个类除了初始化函数外也就只有一个刷新图像界面的函数。
  然后在Qt Designer中添加一个widget控件,再把它提升一下:由于导入关系是from FigureCanvas import MyFigure,所以类名称为MyFigure,头文件为FigureCanvas

  最后,就是再新建一个py文件编写逻辑和界面显示等内容了,这里可以参考前期教程,此处不再赘述。

3.4 扩展

  在查找资料过程中,还找到一个方法有点不同的教程,它是使用graphicView控件来实现的,是基于该控件自带的一些函数来实现的。而且也做到了界面和逻辑分离,值得记录一下:链接。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/393443.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android稳定性相关知识

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。 目录 一、导读二、概览三、相关方法论3.1 crash3.2 性能3.3 高…

一,STM32cubeMX配置FreeRTOS工程

从这篇文章开始,大家就进入到了FreeRTOS的学习之路。 那么,从这里开启学习的第一课如何使用cubeMX配置FreeRTOS工程 文章目录 前言一、使用 cubeMX 配置 FreeRTOS二、CMSIS 接口总结 前言 一、使用 cubeMX 配置 FreeRTOS 选择 stm32 芯片。 选择外部晶振…

【Linux】简单的网络计算器的实现(自定义协议,序列化,反序列化)

文章目录 前言一、 服务端1.ServerCal.cc(服务器主文件)2.ServerCal.hpp3.Sock.hpp(套接字封装)4.TcpServer.hpp(服务器)5.Protocol(自定义协议) 二、用户端1.ClientCal 三、Log.hpp(日志)四、makefile 前言…

洛谷 P8627 [蓝桥杯 2015 省 A] 饮料换购

参考代码and代码解读 #include <bits/stdc.h> using namespace std; int main() { int n; scanf("%d", &n); int dr;//drdrink; dr n;//把drink赋值于n; while (n > 2) {//剩余的总瓶盖数要大于二,才能换得下一瓶饮料; dr n…

C语言系列-带有副作用的宏参数#和##命名约定宏替换的规则

&#x1f308;个人主页: 会编辑的果子君 &#x1f4ab;个人格言:“成为自己未来的主人~” 目录 带有副作用的宏参数 宏替换的规则 宏函数的对比 #和## #运算符 ##运算符 命名约定 #undef 带有副作用的宏参数 当宏参数在宏的定义中出现超过一次的时候&#xff0c;如果…

树莓派登录方式

目录 1.串口登录树莓派 1.1 USB-TTL连接树莓派串口 1.2 修改系统配置&#xff0c;启用串口登录树莓派 1.3 启动树莓派 2.网络方式登录树莓派 2.1 使树莓派接入网络 2.2 网络SSH 方式登录树莓派 2.2.1 打开ssh功能&#xff0c; 输入命令&#xff1a; 1.串口登录树莓派 1…

MOS管故障排查(G极电阻篇)

我们经常看到&#xff0c;在电源电路中&#xff0c;功率MOS管的G极经常会串联一个小电阻&#xff0c;几欧姆到几十欧姆不等&#xff0c;那么这个电阻用什么作用呢&#xff1f; 如上图开关电源&#xff0c;G串联电阻R13这个电阻的作用有2个作用&#xff1a;限制G极电流&#x…

2024最新软件测试八股文(答案+文档)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、B/S架构和C/S架构区别 B/S 只需要有操作系统和浏览器就行&a…

SD-WAN稳定性如何?

随着网络技术的不断发展&#xff0c;软件定义广域网&#xff08;SDWAN&#xff09;作为一种新兴的网络架构&#xff0c;受到了越来越多企业的青睐。然而&#xff0c;对于许多人来说&#xff0c;关于SDWAN最关键的问题之一就是它的稳定性。本文将探讨SDWAN的稳定性表现&#xff…

OpenCV每日函数 结构分析和形状描述符(9) ApproxPolyDP函数 拟合曲线

一、Douglas -Peucker 算法 也称为Ramer-Douglas-Peucker 算法或迭代端点拟合算法,是一种通过减少点数来平滑折线(由线性线段组成的线)的算法。简化曲线应保留原始曲线的粗略形状,但仅包含定义原始曲线的点的子集。 粗化程度由单个参数 ε 控制,该参数定义原始点和简化曲线…

挑战杯 基于CNN实现谣言检测 - python 深度学习 机器学习

文章目录 1 前言1.1 背景 2 数据集3 实现过程4 CNN网络实现5 模型训练部分6 模型评估7 预测结果8 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于CNN实现谣言检测 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&am…

翻译,师爷师爷什么叫事务!

当我们学习 apple 时候&#xff0c;我们很容易记住 apple 是什么。 我们也不会对 apple 的概念产生模糊混淆。 为什么&#xff1f; 因为字典上明确说了&#xff0c;apple 苹果。 那苹果是什么&#xff1f; 苹果就是圆圆的红红的&#xff0c;吃起来甜甜的水果。 我们学习…

开工第一天的精神状态“昨晚失眠”开工第一天的你还好吗?

目录 不想上班 杂乱的内心独白 杂乱的内心独白与代码 结语 不想上班 一想到要返工就有点emo的你 并不是孤身一人 我这一生&#xff0c;如履薄冰&#xff0c;新的一天&#xff0c;从不想上班开始。 杂乱的内心独白 我杂乱的内心啊 杂乱的内心独白与代码 import tkinter…

OpenCV识别人脸案例实战

使用级联函数 基本流程 函数介绍 在OpenCV中&#xff0c;人脸检测使用的是cv2.CascadeClassifier.detectMultiScale()函数&#xff0c;它可以检测出图片中所有的人脸。该函数由分类器对象调用&#xff0c;其语法格式为&#xff1a; objects cv2.CascadeClassifier.detectMul…

php命令行运行 逻辑运算符 多维数组

php命令行运行 1. 命令行的使用2. 逻辑运算符3. 多维数组 1. 命令行的使用 查看php的版本 php -v执行php代码 ➜ ~ php /Users/fanzhen/Documents/phpStudy/hd.php bool(false)2. 逻辑运算符 3. 多维数组 三维数组 取第零个元素 第0个元素的第一个数组

通过字符设备驱动分步注册过程实现LED驱动的编写

通过字符设备驱动分步注册过程实现LED驱动的编写 mychrdev.c #include <linux/init.h> #include <linux/module.h> #include <linux/cdev.h> #include <linux/fs.h> #include <linux/io.h> #include <linux/slab.h> #include <linux/d…

相机图像质量研究(34)常见问题总结:图像处理对成像的影响--拖影

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

【鸿蒙手机】获取UDID,并添加签名认证

一、打开开发者模式 1、手机型号华为nova 10 pro , HarmonyOS版本 4.0&#xff0c;路径&#xff1a;设置-> 关于本机-> 多次连续点击”软件版本“ 这一行&#xff0c;一般是是5到7次&#xff08;我是点击了5次&#xff09;&#xff0c;第一次会弹出输入密码&#xff0c;验…

猪圈Pigsty-PG私有RDS集群搭建教程

博客 https://songxwn.com/Pigsty-PG-RDS/ 简介 Pigsty 是一个更好的本地自建且开源 RDS for PostgreSQL 替代&#xff0c;具有以下特点&#xff1a; 开箱即用的 PostgreSQL 发行版&#xff0c;深度整合地理、时序、分布式、图、向量、分词、AI等 150 余个扩展插件&#xff…

作业2024/2/18

1.思维导图 2.定义一个基类Animal&#xff0c;其中有一个虚函数perform ()&#xff0c;用于在子类中实现不同的表演行为。 #include <iostream>using namespace std; class Animal { private:public:void virtual perform() 0;}; class Tiger:public Animal { private:…