Matplotlib画图教程:在QT界面中嵌入三维图片

Matplotlib画图教程:在QT界面中嵌入三维图片

需求:

做项目报告的时候,有这么一个想法,就是能通过UI随时调用matplotlib进行二维图和三维图的绘制。因此就诞生了做这么一个小模块的想法。

这里先上一下最终结果:
在这里插入图片描述

思路:

pyqt5内嵌matploblib画布。

matplotlib画布中有一个FigureCanvasQTAgg的模块可以用于UI绘制


模块设计思路:

1. ui文件

ui文件是通过qtdesigner直接生成的ui源码,与图表绘制相独立。

2. 图表绘制文件

该文件用于设计一个matplotlib图表绘制类,存放我们需要做报告的任何图图表,以及我们的一些数据导入。

3. 运行文件

运行文件继承上面两个文件,运行实例。


UI模块

这个模块没什么好说的,基于QTdesigner进行图形绘制,图形界面已经每个组件定义如下。(这个模块在教程中只是用于演示)

1.1 UI图形类

类:Ui_matplot_demo图形绘制类
实例化方式不需要入参
方法
self.setupUi构建一个UI窗口

1.2 测试UI界面及其属性

绘制的界面样式
界面样式
界面控件属性
界面控件属性

1.3 代码

# -*- coding: utf-8 -*-# Form implementation generated from reading ui file 'ui_ut.ui'
#
# Created by: PyQt5 UI code generator 5.15.6
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_matplot_demo(object):def setupUi(self, matplot_demo):matplot_demo.setObjectName("matplot_demo")matplot_demo.resize(1133, 721)self.gridLayout = QtWidgets.QGridLayout(matplot_demo)self.gridLayout.setObjectName("gridLayout")self.bt_close = QtWidgets.QPushButton(matplot_demo)self.bt_close.setObjectName("bt_close")self.gridLayout.addWidget(self.bt_close, 1, 1, 1, 1)self.bt_open = QtWidgets.QPushButton(matplot_demo)self.bt_open.setObjectName("bt_open")self.gridLayout.addWidget(self.bt_open, 1, 0, 1, 1)self.plt3d_module = QtWidgets.QWidget(matplot_demo)self.plt3d_module.setMinimumSize(QtCore.QSize(1111, 611))self.plt3d_module.setObjectName("plt3d_module")self.gridLayout.addWidget(self.plt3d_module, 0, 0, 1, 2)self.retranslateUi(matplot_demo)QtCore.QMetaObject.connectSlotsByName(matplot_demo)def retranslateUi(self, matplot_demo):_translate = QtCore.QCoreApplication.translatematplot_demo.setWindowTitle(_translate("matplot_demo", "Form"))self.bt_close.setText(_translate("matplot_demo", "按一下就可以关闭图片"))self.bt_open.setText(_translate("matplot_demo", "按一下就可以画图"))

图表绘制模块

这个模块是核心的图表绘制模块,主要结构如下

1.1 依赖包

包名含义安装方式
numpy数学运算包pip install numpy
matplotlilb数学绘图包pip install matplotlib

1.2 类

类:MyFigure图形绘制类
实例化方式入参含义
width=5控制画布宽度
height=4控制画布高度
dpi=100控制画布分辨率
属性含义初值
self.fig实例化一个matplotlib的Figure类
self.axes坐标系,可以是二维,也可以是三维
方法
plot_sin画一个正弦函数
plot_cos画一个余弦函数
plot_3d画一个3D的图(基于leetcode218 天际线)

1.3 代码如下

import numpy as np
import matplotlib
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
matplotlib.use("Qt5Agg")  # 声明使用QT5# 创建一个matplotlib图形绘制类
class MyFigure(FigureCanvas):def __init__(self, width=5, height=4, dpi=100):# 第一步:创建一个创建Figureself.fig = Figure(figsize=(width, height), dpi=dpi)# 第二步:在父类中激活Figure窗口super(MyFigure, self).__init__(self.fig)  # 此句必不可少,否则不能显示图形# 第三步:创建一个子图,用于绘制图形用,111表示子图编号,如matlab的subplot(1,1,1)self.axes = None# 第四步:就是画图,【可以在此类中画,也可以在其它类中画】def plot_sin(self):self.axes = self.fig.add_subplot(111)t = np.arange(0.0, 3.0, 0.01)s = np.sin(2 * np.pi * t)self.axes.plot(t, s)def plot_cos(self):self.axes = self.fig.add_subplot(111)t = np.arange(0.0, 3.0, 0.01)s = np.sin(2 * np.pi * t)self.axes.plot(t, s)def plot_3d(self):self.axes = self.fig.add_subplot(111, projection='3d')x_edges = np.array([[10, 20], [10, 20], [10, 20], [10, 20],[20, 30], [20, 30], [20, 30], [20, 30],[30, 40], [30, 40], [30, 40], [30, 40],[40, 50], [40, 50], [40, 50], [40, 50]])# 设置y轴取值y_edges = np.array([[10, 20], [20, 30], [30, 40], [40, 50],[10, 20], [20, 30], [30, 40], [40, 50],[10, 20], [20, 30], [30, 40], [40, 50],[10, 20], [20, 30], [30, 40], [40, 50],[10, 20], [20, 30], [30, 40], [40, 50]])# 设置X,Y对应点的值。即原始数据。hist = np.array([[3.0], [0.0], [8.0], [4.0],[2.0], [4.0], [5.0], [7.0],[9.0], [2.0], [6.0], [3.0],[0.0], [3.0], [1.0], [0.0]])color_list = ['skyblue', 'lightgreen', 'bisque', 'gold','lightgreen', 'bisque', 'gold', 'lightpink','bisque', 'gold', 'lightpink', 'plum','gold', 'lightpink', 'plum', 'lightgray']for i in range(len(x_edges)):# 设置作图点的坐标xpos, ypos = np.meshgrid(x_edges[i][:-1] - 2.5, y_edges[i][:-1] - 2.5)xpos = xpos.flatten('F')ypos = ypos.flatten('F')zpos = np.zeros_like(xpos)# 设置柱形图大小dx = 5 * np.ones_like(zpos)dy = dx.copy()dz = hist[i].flatten()# 设置坐标轴标签self.axes.set_xlabel('front')self.axes.set_ylabel('side')self.axes.set_zlabel('height')self.axes.bar3d(xpos, ypos, zpos, dx, dy, dz, color=color_list[i], zsort='average')

运行模块

1.1 依赖包

包名含义安装方式
sys系统包-
PyQt5UI包pip install pyqt5
项目包
ui_utUI模块
leetcode218_figure图表绘制模块

1.2 类

类:myWindow运行窗口类
继承父类
QWidget
Ui_matplot_demo
实例化方式入参含义
不需要入参实例化
属性含义初值
self.F实例化一个MyFigure的图表绘制类
方法
open_pic在UI中画图,绑定bt_open控件
close_pic关闭图片,绑定bt_close控件

1.3 最后再封装一个main函数调用,代码如下:

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from ui_ut import Ui_matplot_demo
from leetcode218_figure import MyFigureclass myWindow(QWidget, Ui_matplot_demo):def __init__(self):super(myWindow, self).__init__()self.setupUi(self)self.setWindowTitle("显示matplotlib绘制图形")self.setMinimumSize(0, 0)# 第五步:定义MyFigure类的一个实例self.F = MyFigure(width=10, height=6, dpi=100)self.F.plot_cos()# 第六步:在GUI的groupBox中创建一个布局,用于添加MyFigure类的实例(即图形)后其他部件。# 在容器中添加一个groupbox对象,在groupbox对象中创建布局self.groupBox = QGroupBox(self.plt3d_module)self.groupBox.setMinimumSize(QSize(1100, 610))self.groupBox.setTitle("画图demo")def connect_bind():self.bt_open.clicked.connect(self.open_pic)self.bt_close.clicked.connect(self.close_pic)connect_bind()self.glo_plt_figure = QGridLayout(self.groupBox)def open_pic(self):self.F = MyFigure(width=10, height=6, dpi=100)self.F.plot_3d()self.glo_plt_figure.addWidget(self.F, 0, 0)print("here")self.show()self.glo_plt_figure.addWidget(self.F, 0, 0)def close_pic(self):self.glo_plt_figure.removeWidget(self.F)self.show()def main():app = QApplication(sys.argv)win = myWindow()win.show()sys.exit(app.exec_())if __name__ == "__main__":main()

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

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

相关文章

Python工程笔记(1):轨迹与日志

轨迹记录模块(Recorder) 轨迹和日志是定位工程问题的备忘录和总结代码开发项目管理经验的基本素材,是工程交验收资料的重要组成部分 1.1 依赖表 包名含义安装方式系统包ostime 1.2 全局变量表 变量名含义初值log_file日志保存路径./recor…

Python代码优化(1):天气预报获取

天气预报获取模块 基于http://www.weather.com.cn/做了代码优化,每个函数功能更加明确,更加适合单独集成。接口也进行了优化,比网络上博主抄来抄去的源码要好一些。 改进点:获取天气拆成了多个函数,多次保存csv文件不…

proxy_pool开源项目攻克学习

开源项目攻克学习之proxy_pool 1. 学习背景 爬虫线程池,但是网络上付费的又很麻烦,于是在开源网站上找到一个版本进行学习。 https://github.com/jhao104/proxy_pool 本人操作系统deepin,有遇到一些问题,希望可以跟大家分享一…

pip 指定镜像源 指定版本 批量安装

要用 pip 安装指定版本的 Python 包,只需通过 操作符 指定 例如:pip install pycrypto2.6.1 将安装pycrypto2.6.1 版本。 要使用pip 批量安装,需要写requirements.txt文件,一行一个包 numpy matplotlib wxpypip install -r r…

Linux命令行下统计当前文件夹下的文件个数

统计某文件夹下文件的个数 ls -l |grep “^-”|wc -l 统计某文件夹下目录的个数 ls -l |grep “^d”|wc -l 统计文件夹下文件的个数,包括子文件夹里的。 ls -lR|grep “^-”|wc -l 统计文件夹下目录的个数,包括子文件夹里的。 ls -lR|…

proxy_pool开源项目攻克学习2:服务器架设

proxy_pool开源项目攻克学习2:服务器架设 在这个文章proxy_pool开源项目攻克学习中,我们完成了本地的proxy_pool架设。现在我们将他转移到服务器上。 硬件环境准备 腾讯centos服务器。 软件环境准备 redispython3.7proxy_pool开源项目 安装过程 总…

python opencv安装

opencv安装 pip install opencv-python依赖安装 # libglvnd-1:1.3.2-1.tl3.x86_64 # libglvnd-glx-1:1.3.2-1.tl3.x86_64 # libxshmfence-1.3-2.tl3.x86_64 # mesa-libGL-20.3.3-2.tl3.x86_64 # mesa-libglapi-20.3.3-2.tl3.x86_64yum install libGL

nodejs轻量服务器后端

nodejs轻量服务器后端 搭建思路 server.js主函数 mine.js配置文件 index.html 测试网页 目录结构 __./|__ test1|__ index.html|__ mine.js|__ server.jsserver.js文件 var PORT 8080; //端口 var DIR test1; //用于存放html的目录var http require(http);…

[Leetcode713]乘积小于 K 的子数组

公司里偷偷刷题记录 做一下笔记 求解子数组方式: 两种方案: 通用方案就是前缀和查找 另一种是递增序列可用的滑动窗口 有些题目如果给出来的数字有正,负。那么一定就要转化成前缀和。 如果是全正数组,可以采用前缀和二分查找的…

[Leetcode15]三数之和

重刷一遍相向双指针 题目 leetcode15 https://leetcode.cn/problems/3sum/ 类似的题目还有leetcode16 leetcode16 解答思路 关键点 快排 双指针 1: 快速排序,之后使用双指针遍历对应的位置,求解 2: 主要是在确定了第一个值…

光学元件生产工艺流程

光学元件生产工艺流程 选胚料 – 开料(初步切割)- 清洗 - 上盘(批处理) – 切割 – 粗磨整平 – 粗检 – 细磨上盘 – 细磨 – 高速抛光 – 低速抛光 – 光胶 – 成片 – 上盘 – 成品切割 – 清洗 – 包装 粗磨阶段 选胚料: 选择光学元件的原材料,如K9,BK7玻璃等 开…

[leetcode933]最近的请求次数

每日偷偷刷题933和队列有关 思路 每来一次ping就记录时间,并返回3000s内ping的次数,本题数据量很大,正向暴力肯定是不行的。 初步思路:反向暴力,不删列表数据。从ping的下标往前推,并统计3000s的数据。 …

[leetcode]5. 最长回文子串 647. 回文子串

昨日刷题,今日补发 解题思路 中间扩展,遍历数组,以每一项为中心,或以每两项为中心,向外拓展。 学习一下pair概念,还有string的substr的用法 以下是leetcode第五题 C做法 class Solution { public:pair…

牛客网选择题刷题记录之C++

数据结构 顺序表 在一个长度为n的顺序表的任意位置插入一个新元素的渐进时间复杂度为() A. O(n) B. O(n/2) C. O(1) D. O(n的平方) 答案: A 解析…

[剑指offer 24] 反转链表

题目复习反转链表 字节面试的一道面试考题。属于简单题,毕竟复杂的面试也不好判题对吧(狗头) 思路 思路不难,首先我们观察链表,一般链表指的都是单向链表 struct ListNode {int val;struct ListNode *next; };那么…

[剑指offer 27][LeetCode234] 回文链表

偷偷刷题记录 回文链表 思路 思路1. 处理链表最粗暴的方式就是拷贝到数组中。考试时候也是,只要不会超内存,完全这么办 思路2. 快慢指针。因为我们判断是不是回文链表,回文的特性就是以中为界,两头对称。由于我们不能像使用数组…

牛客网选择题刷题记录之Linux系统

linux运维 linux指令 下面有关linux查看系统负载的命令,说法错误的是? A. uptime命令主要用于获取主机运行时间和查询linux系统负载等信息 B. vmstat命令可以查看查看cpu负载 C. sar -n命令可以查看网络接口信息 D. free命令可以查看磁盘负载情况 答案&…

Keil_uvision_4基本使用教程

前言: keil uvision 5 和 4 使用方式差不多 Keil_uvision_4基本使用教程 Keil C51 V9.00 即09年发布的最新版本uVision 4,版本外观改变比较大 可以使用以前的注册文件如果全新安装,在VISTA或者WIN 7系统下…

MySQL语法看这一篇就够啦

MySQL语法看这一篇就够啦1. MySQL介绍与登录1.1 MySQL介绍1.2 Mariadb安装与启动1.2.1 在centos7环境下安装启动登录数据库操作部分增删改查:增 CREATE DATABASE增删改查:删 DROP增删改查:查找数据库 SHOW DATABASE使用数据库:use…

Python数据库:嵌入式MySQL

Python数据库:嵌入式MySQLPython访问MySQL的库函数PyMySQL安装PyMySQL快速上手以及代码上下文PyMySQL常见语法1. 导包2.连接数据库 connect3. 创建访问对象 cursor4. 下达命令 cursor.execute5. 接收结果 cursor.fetch*6.事务的用法7. 关闭mysql链接 closePython访问…