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,一经查实,立即删除!

相关文章

proxy_pool开源项目攻克学习

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

Keil_uvision_4基本使用教程

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

部门名称部门结构叠用_金属结构分公司三部门联合开展工会小组活动

为丰富职工的业余生活,营造轻松欢乐的氛围,增强部门间交流沟通,舒缓职工工作压力,在金属结构分公司工会的支持下,9月12日,分公司工程管理部、安全监管部和综合办公室联合开展工会小组活动,分公司…

不是区块链的特征_上市公司日照港物流区块链平台上线,不是谁都能玩“区块链+物流”?...

免责声明:本文旨在传递更多市场信息,不构成任何投资建议。文章仅代表作者观点,不代表火星财经官方立场。小编:记得关注哦投资区块链,猛戳:火星财经App下载来源:火星一线文 | 成文厚火星财经APP(…

lg手机历史机型_华为后,又一中国芯崛起!国际手机巨头LG都采用它的芯片了...

众所周知,这几年芯片火热,中国芯片厂商们也是受到了大家空前的关注。任何有关于中国芯的利好,都会被放大,被网友们看好。当然,华为是中国这些芯片企业中最强的,5G芯片华为也是目前最领先的,像巴…

Java学习资料汇总

Java语言特点和常见错误1 Java语言特点总结1.1 语言特点1.2 运行机制1.3 JVM虚拟机1.4 JRE运行环境1.5 JDK开发环境Linux下的java安装,编译,运行三大引用类型1 Java语言特点总结 这段内容来自北大唐教授的教案 1.1 语言特点 • 无直接指针操作 • 自动内存管理 • 数据类型长…

windows环境下安装多个任意版本的python环境

windows环境下安装多个任意版本的python环境windows环境下安装多个任意版本的python环境下载Python下载pipstep1. 用get-pip下载pipstep2. 分析安装的文件step3. 使用pip得到报错" No module named pip "step4. 原因分析和解决方案其他报错1. ERROR: Could not find …

2022年新版Pycharm通过project interpreter国内镜像源设置

2022年新版Pycharm通过project interpreter国内镜像源设置解决方案速览一、国内镜像源列表二、pycharm访问project interpreter解决方案速览 File->Settings->project interpreter-> -> Available Packages将options打勾,并输入-i https://pypi.tuna.…

flink 不设置水印_从0到1学习Flink—— Flink parallelism 和 Slot 介绍

前言之所以写这个是因为前段时间自己的项目出现过这样的一个问题:1Caused by: akka.pattern.AskTimeoutException: 2Ask timed out on [Actor[akka://flink/user/taskmanager_0#15608456]] after [10000 ms]. 3Sender[null] sent message of type "org.apache.…

cad设计院常用字体_趣谈 | 那些年我们看过的电气图纸(附CAD/EPLAN区别)

电气二次回路图是我们工作中必不可少的内容,形形色色的图纸我们见过很多,小编就下面额图纸和大家分享一下,仅作为个人观点,大家的意见可在留言区补充哦!先看看几张老外额图纸吧,譬如ABB、GE,但并…

centos写mysql光标移到上一行_mysql:一条SQL更新语句(update)是如何执行的

一条更新语句的执行流程又是怎样的呢?之前你可能经常听DBA同事说,MySQL可以恢复到半个月内任意一秒的状态,惊叹的同时,你是不是心中也会不免会好奇,这是怎样做到的呢?我们还是从一个表的一条更新语句说起&a…

小米wifi每天晚上准时断网_小米 11再次确定,将于28日准时发布,售价更感人

今天是12月25日,在28日晚上,小米 11将准时发布。如今,关于小米 11的消息已经越来越多,小米官方也已经确定了不少配置,同时,小米 11的售价也已经有爆料出现。根据爆料消息显示,小米 11此次或为45…

opengl 深度详解_一步步学OpenGL(23) -《阴影贴图1》

教程 23阴影贴图1原文: http://ogldev.atspace.co.uk/www/tutorial23/tutorial23.htmlCSDN完整版专栏: https://blog.csdn.net/cordova/article/category/9266966背景阴影和光是紧密联系的,正如你需要光才能投射出阴影。有许多的技术可以生成…

ug后处理如何加密_UG在NX加工中如何添加后处理文件?

在使用UG加工中,往往使用的机床不一样就要特定后处理文件,那么如何在UG中添加之前制定好的后处理文件呢?下面以UG8.5为例来说明。1、首先确认UG后处理文件是否完整。完整的后处理文件包括后缀为.def、.pui和.tcl的三个文件(注&…

华为mstp多生成树配置_网络工程师(30):多实例生成树如何计算

多实例生成树MSTP包括域间的外部生成树CST和域内的内部生成树IST,我们通称为CIST。我们先讨论CST的计算。在CST中,一个MST域看作是一台"交换机",那么在进行CST计算时,这台"交换机"的桥ID是多少呢?…

url中能出现的字符_python爬虫,解决大众点评字符库反爬机制的经验

刚开始写文章还希望大家可以喜欢,对于爬虫只是个人整理出的方法,爬虫大牛请嘴下留情。“”仅限学术交流,如有冒犯请联系作者删除“”话不多说,想分析天津地区餐饮行业的大致情况,要爬出(商铺名称&#xff0…

上课点名app_【APP种草】网瘾少年的自我救赎之最强锁机软件

相信在这个魔幻的2020,大家都经历了很多个不寻常吧。作为学生党,算是圆梦了在家学习的愿望,可当这一切都变成现实的时候,也还是没逃过点名、没逃过网课,这不,连期末考也又双叕叕地来了。作为一名需要在家完…

qrcode生产带logo_比亚迪换新标?新Logo的含义你了解吗?

对于许多制造业品牌来说,由于时代发展的速度太快,科技的力量进步太快,即便是规模庞大的老牌企业,也需要不断改变自己,以此来适应社会的改变求得生存。这就意味着,无论是什么品牌,都需要定期改变…

超前进位加法器实验报告_干货 | 加法器与反相加法器原理解析

什么是加法器加法器是为了实现加法的,即是产生数的和的装置。加数和被加数为输入,和数与进位为输出的装置为半加器。若加数、被加数与低位的进位数为输入,而和数与进位为输出则为全加器。常用作计算机算术逻辑部件,执行逻辑操作、…

php 支付宝小程序授权登陆验签_星巴克“啡快”登陆支付宝小程序,让你“飞快”取到咖啡...

当代年轻人的生活方式是怎样的?靠地铁通勤,靠咖啡续命早上睁不开眼,咖啡来一杯中午昏昏欲睡,咖啡来一杯晚上熬夜加班,咖啡来一杯喝完这杯,还有一杯“宁可食无肉,不可早无星”是当代年轻人的座右…