【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 npimport 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 Figureclass 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控件来实现的,是基于该控件自带的一些函数来实现的。而且也做到了界面和逻辑分离,值得记录一下:链接。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

transformer-Attention is All You Need(一)

1. 为什么需要transformer 循环模型通常沿输入和输出序列的符号位置进行因子计算。通过在计算期间将位置与步骤对齐,它们根据前一步的隐藏状态和输入产生位置的隐藏状态序列。这种固有的顺序特性阻止了训练样本内的并行化,这在较长的序列长度上变得至关重…

STM32-开发工具

开发过程中可能用到的工具 1、烧录下载调试工具ST-LINK ST-LINK,是ST(意法半导体)推出的调试编程工具,适用于STM32系列芯片的USB接口的下载及在线仿真器。 2、串口调试工具/串口下载工具 串口调试工具是一种用于通过串口通信协议与目标设备进行数据交…

源码网打包,目前有3000多个资源

源码网打包,目前有3000多个资源 需要赶快下手吧,到手可以使用,搭建好和本站一样,全网唯一 优化缩略图演示:https://www.htm.ink默认缩略图演示:https://blog.htm.ink网站截图

const--类的常量成员函数

在C中,为了禁止成员函数修改数据成员的值,可以将它设置为常量成员函数。设置常量成员函数的方法是在函数原型的后面加上const,形式如下: class x { …………… T f(t1,t2) const{} ………… }; 常量成员函数的作用: 将成员函数设置为const,表明该成员函…

FMEA的六大分类——SunFMEA软件

FMEA是一种预防性的质量工具,通过对产品设计或过程的故障模式进行分析,评估其可能产生的影响,从而采取相应的措施来降低产品的故障风险。根据分析的范围和目的,FMEA可以分为以下几种类型,今天sun fmea软件系统和大家一…

理解孟子思想,传承中华文化

为了更好地了解和传承中华文化,加深对孟子思想的认识与理解,探究孟子思想在现代社会的传承与发展,2024年2月18日,曲阜师范大学计算机学院“古韵新声,格物致‘知’”实践队队员崔本迪在山东省泰安市东平县进行了深入的调…

vue-路由(六)

阅读文章你可以收获什么? 1 明白什么是单页应用 2 知道vue中的路由是什么 3 知道如何使用vueRouter这个路由插件 4 知道如何如何封装路由组件 5 知道vue中的声明式导航router-link的用法 6 知道vue中的编程式导航的使用 7 知道声明式导航和编程式导航式如何传…

代码随想录算法训练营第33天| Leetcode1005.K次取反后最大化的数组和、134. 加油站、135. 分发糖果

文章目录 Leetcode 1005.K次取反后最大化的数组和Leetcode 134. 加油站Leetcode 135. 分发糖果 Leetcode 1005.K次取反后最大化的数组和 题目链接:Leetcode 1005.K次取反后最大化的数组和 题目描述: 给你一个整数数组 nums 和一个整数 k ,按…

根据三维点坐标使用matplotlib绘制路径轨迹

需求:有一些点的三维坐标(x,y,z),需要绘制阿基米德螺旋线轨迹图。 points.txt 0.500002, -0.199996, 0.299998 0.500545, -0.199855, 0.299338 0.501112, -0.199688, 0.298704 0.501701, -0.199497, 0.298…

在Linux系统中设置HTTP隧道以实现网络穿透和端口转发

在数字化世界中,网络穿透和端口转发成为了许多开发者和系统管理员必备的技能。而在Linux系统中,通过设置HTTP隧道,我们可以轻松实现这一目标,让我们的服务即便在内网环境中也能被外部世界所访问。 那么,如何在Linux系…

一文搞懂设计模式—观察者模式

本文已收录至Github,推荐阅读 👉 Java随想录 微信公众号:Java随想录 文章目录 使用场景实现方式Java对观察者模式的支持Guava对观察者模式的支持Spring对观察者模式的支持 优缺点 观察者模式(Observer Pattern)是一种…

小型洗衣机哪个牌子质量好?小型洗衣机十大排名

清洗内衣内裤这些贴身衣物确实是一件比较头疼的事,有的小伙子由于工作的劳累通常在洗完澡后并不喜欢直接清洗内衣内裤,会存上几天再扔到洗衣机里,这样做是很不可取的,因为穿过的内裤很久不洗就会滋生细菌,另外&#xf…

Java使用Documents4j实现Word转PDF(知识点+案例)

文章目录 前言源码获取一、认识Documents4j二、快速集成2.1、pom.xml依赖2.2、word转PDF实现项目目录WordUtils.javaDemo6.java测试效果 参考文章资料获取 前言 博主介绍:✌目前全网粉丝2W,csdn博客专家、Java领域优质创作者,博客之星、阿里…

Linux-系统资源管理的命令

目录 查看CPU:more /proc/meminfo 查看内存数据:free -m / free -h 查看系统版本:more /etc/issue 查看操作系统的类型:uname -a 查看主机名称:hostname 查看磁盘空间:df -h 查看某个目录空间…

【解决(几乎)任何机器学习问题】:处理分类变量篇(上篇)

这篇文章相当长,您可以添加至收藏夹,以便在后续有空时候悠闲地阅读。 本章因太长所以分为上下篇来上传,请敬请期待 很多⼈在处理分类变量时都会遇到很多困难,因此这值得⽤整整⼀章的篇幅来讨论。在本章中,我将 讲述不同…

快速搞懂时间序列数据平稳检验

在对时间序列数据进行分析预测时,平稳时间序列数据预测效果更好。所以首先要检测数据是否平稳,没有趋势的时间序列数据,我们称为平稳的,即随着时间的推移,表现出恒定的方差,具有恒定的自相关结构。本文介绍…

Linux 虚拟机在线热扩容分区

介绍 本教程是用于Linux虚拟机在调整虚拟硬盘大小后,进行在线不重启热扩容分区大小。 适用于RHEL 7以上的版本及衍生发行版。(如Centos、Rocky Linux、Alma Linux等) 硬盘分区在线热扩容 刷新硬盘容量 echo 1 > /sys/block/sda/device…

GIS利用不舒适指数绘制地区的生物气候舒适度图

生物气候舒适度定义了最适宜的气候条件,在这种条件下,人们感到健康和充满活力。生物气候舒适度地图对城市规划研究特别有用。温度、相对湿度和风速等要素对评估生物气候舒适度非常重要。[1] 人们已经得出了许多不同的指数来确定生物气候舒适度。在本博文中,我们将使用广泛使…

Elcomsoft 取证工具包系列:Advanced Office Password Recovery

天津鸿萌科贸发展有限公司是 Elcomsoft 系列软件授权代理商。 Advanced Office Password Recovery 是 Elcomsoft 取证工具包中的密码破解软件之一。它可以恢复、删除或规避使用各种 Office 套件创建的文档的密码。可以对 WordPerfect,Lotus,OpenOffice&…

[晓理紫]每日论文分享(有中文摘要,源码或项目地址)--大模型、扩散模型等

专属领域论文订阅 VX关注{晓理紫},每日更新论文,如感兴趣,请转发给有需要的同学,谢谢支持 如果你感觉对你有所帮助,请关注我,每日准时为你推送最新论文。 为了答谢各位网友的支持,从今日起免费为…