PyQt5结合matplotlib绘图的实现示例


Posted in Python onSeptember 15, 2020

参考网上的例子,实现了简单的matplotlib pyqt5绘图 

相关知识点:
 (1)pyqt5中添加控件要在布局中添加
 (2)布局可以使用replaceWidget替换控件
 (3)信号与槽机制

timer = QtCore.QTimer(self)
timer.timeout.connect(self.update_figure)

self.btnPlot.clicked.connect(self.plotButton_callback)

实现的效果

PyQt5结合matplotlib绘图的实现示例

import sys
from PyQt5 import QtCore, QtGui, uic
from PyQt5.QtWidgets import QMainWindow, QAction, qApp, QApplication, QMessageBox, QVBoxLayout, QSizePolicy, QWidget

from PyQt5.QtGui import QIcon
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import matplotlib.pyplot as plt
import numpy as np

qtCreatorFile = "matplotlib_ui.ui"
# 使用uic加载
Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile)

class MyMplCanvas(FigureCanvas):
  """这是一个窗口部件,即QWidget(当然也是FigureCanvasAgg)"""
  def __init__(self, parent=None, width=5, height=4, dpi=100):
    fig = Figure(figsize=(width, height), dpi=dpi)
    self.axes = fig.add_subplot(111)
    # 每次plot()调用的时候,我们希望原来的坐标轴被清除(所以False)
    self.axes.hold(False)
    self.axes.grid('on')

    self.compute_initial_figure()

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

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

  def compute_initial_figure(self):
    pass

class MyStaticMplCanvas(MyMplCanvas):
  """静态画布:一条正弦线"""
  def compute_initial_figure(self):
    t = np.arange(0.0, 3.0, 0.01)
    s = np.sin(2 * np.pi * t)
    self.axes.grid('on')
    self.axes.plot(t, s)


class MyDynamicMplCanvas(MyMplCanvas):
  """动态画布:每秒自动更新,更换一条折线。"""
  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.grid('on')
    self.axes.plot([0, 1, 2, 3], [1, 2, 0, 4], 'r')

  def update_figure(self):
    # 构建4个随机整数,位于闭区间[0, 10]
    l = [np.random.randint(0, 10) for i in range(4)]
    self.axes.grid('on')
    self.axes.plot([0, 1, 2, 3], l, 'r')
    self.draw()

class MyApp(QMainWindow, Ui_MainWindow):

  def __init__(self):
    QMainWindow.__init__(self)
    Ui_MainWindow.__init__(self)
    super().__init__()

    self.initUI()
    self.initBtn()
    self.initFrame()

  def initFrame(self):
    self.main_widget = self.frame
    self.layout = QVBoxLayout(self.main_widget)
    self.f = MyMplCanvas(self.main_widget)
    self.layout.addWidget(self.f)

  def initUI(self):        

    self.setupUi(self)
    self.setWindowTitle("PyQt5结合Matplotlib绘图")
    self.setWindowIcon(QIcon("rocket.ico"))  # 设置图标,linux下只有任务栏会显示图标

    self.show()

  def initBtn(self):
    self.btnPlot.clicked.connect(self.plotButton_callback)
    self.btnPlot.setToolTip("Button")     

  def plotButton_callback(self):

    self.drawFrame()

  def drawFrame(self):

    sc = MyStaticMplCanvas(self.main_widget, width=5, height=4, dpi=100)
    dc = MyDynamicMplCanvas(self.f, width=5, height=4, dpi=100)
    self.layout.addWidget(sc)
    self.layout.replaceWidget(self.f,dc) # 替换控件

if __name__ == '__main__':

  app = QApplication(sys.argv)
  ex = MyApp()
  sys.exit(app.exec_())

参考链接:https://www.cnblogs.com/hhh5460/p/4322652.html

到此这篇关于PyQt5结合matplotlib绘图的实现示例的文章就介绍到这了,更多相关PyQt5结合matplotlib内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python sort、sorted高级排序技巧
Nov 21 Python
python学习 流程控制语句详解
Jun 01 Python
怎样使用Python脚本日志功能
Aug 14 Python
分享给Python新手们的几道简单练习题
Sep 21 Python
Python+selenium实现自动循环扔QQ邮箱漂流瓶
May 29 Python
python和opencv实现抠图
Jul 18 Python
python 提取key 为中文的json 串方法
Dec 31 Python
python将视频转换为全字符视频
Apr 26 Python
python实现按行分割文件
Jul 22 Python
Python generator生成器和yield表达式详解
Aug 08 Python
解决django的template中如果无法引用MEDIA_URL问题
Apr 07 Python
python爬虫爬取某网站视频的示例代码
Feb 20 Python
pycharm激活方法到2099年(激活流程)
Sep 22 #Python
pycharm专业版远程登录服务器的详细教程
Sep 15 #Python
深入浅析pycharm中 Make available to all projects的含义
Sep 15 #Python
pycharm-professional-2020.1下载与激活的教程
Sep 21 #Python
有关pycharm登录github时有的时候会报错connection reset的问题
Sep 15 #Python
Pycharm Git 设置方法
Sep 15 #Python
2020版Python学习路线图(附学习资料)
Sep 15 #Python
You might like
php读取本地文件常用函数(fopen与file_get_contents)
2013/09/09 PHP
PHP文件大小格式化函数合集
2014/03/10 PHP
PHP对象递归引用造成内存泄漏分析
2014/08/28 PHP
YII框架批量插入数据的方法
2017/03/18 PHP
关于php开启错误提示的总结
2019/09/24 PHP
javascript数组使用调用方法汇总
2007/12/08 Javascript
Jquery 弹出层插件实现代码
2009/10/24 Javascript
JavaScript高级程序设计(第3版)学习笔记 概述
2012/10/11 Javascript
javascript利用控件对windows的操作实现原理与应用
2012/12/23 Javascript
JS调用CS里的带参方法实例
2013/08/01 Javascript
详解JavaScript中的forEach()方法的使用
2015/06/08 Javascript
JavaScript中的this到底是什么(一)
2015/12/09 Javascript
类似于QQ的右滑删除效果的实现方法
2016/10/16 Javascript
vue+mockjs模拟数据实现前后端分离开发的实例代码
2017/08/08 Javascript
js利用拖放实现添加删除
2020/08/27 Javascript
[01:38]2018DOTA2亚洲邀请赛主赛事第二日现场采访 神秘商人痛陈生计不易
2018/04/05 DOTA
[06:57]DOTA2-DPC中国联赛 正赛 Ehome vs PSG.LGD 选手采访
2021/03/11 DOTA
Python的pycurl包用法简介
2015/11/13 Python
动感网页相册 python编写简单文件夹内图片浏览工具
2016/08/17 Python
python实现批量修改文件名代码
2017/09/10 Python
如何在sae中设置django,让sae的工作环境跟本地python环境一致
2017/11/21 Python
python装饰器简介---这一篇也许就够了(推荐)
2019/04/01 Python
利用Bootstrap实现漂亮简洁的CSS3价格表实例源码
2017/03/02 HTML / CSS
微信html5页面调用第三方位置导航的示例
2018/03/14 HTML / CSS
什么是事务?事务有哪些性质?
2012/03/11 面试题
外贸英语毕业生自荐信
2013/11/14 职场文书
服装行业创业计划书范文
2014/02/05 职场文书
人力管理专业毕业生求职信
2014/02/27 职场文书
房屋租赁协议书
2014/04/10 职场文书
优秀语文教师事迹
2014/05/18 职场文书
2015年工商所工作总结
2015/05/21 职场文书
2016参观监狱警示教育活动心得体会
2016/01/15 职场文书
HTML中的表格元素介绍
2022/02/28 HTML / CSS
Meta增速拉垮,元宇宙难当重任
2022/04/29 数码科技
vue实现在data里引入相对路径
2022/06/05 Vue.js