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的while循环中使用else以及循环嵌套的用法
Oct 14 Python
判断网页编码的方法python版
Aug 12 Python
Python使用迭代器捕获Generator返回值的方法
Apr 05 Python
python中实现延时回调普通函数示例代码
Sep 08 Python
python3解析库lxml的安装与基本使用
Jun 27 Python
python 获取图片分辨率的方法
Jan 08 Python
利用Django模版生成树状结构实例代码
May 19 Python
通过pycharm使用git的步骤(图文详解)
Jun 13 Python
Python跳出多重循环的方法示例
Jul 03 Python
python开发之anaconda以及win7下安装gensim的方法
Jul 05 Python
python opencv实现直线检测并测出倾斜角度(附源码+注释)
Dec 31 Python
Django显示可视化图表的实践
May 10 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 处理TXT文件(打开/关闭/检查/读取)
2013/05/13 PHP
php实现获取及设置用户访问页面语言类
2014/09/24 PHP
ThinkPHP打开验证码页面显示乱码的解决方法
2014/12/18 PHP
写出更好的JavaScript之undefined篇(上)
2009/11/22 Javascript
JS实现在Repeater控件中创建可隐藏区域的代码
2010/09/16 Javascript
js实现匹配时换色的输入提示特效代码
2015/08/17 Javascript
js clearInterval()方法的定义和用法
2015/11/11 Javascript
EasyUi中的Combogrid 实现分页和动态搜索远程数据
2016/04/01 Javascript
JS 拼凑字符串的简单实例
2016/09/02 Javascript
js 转json格式的字符串为对象或数组(前后台)的方法
2016/11/02 Javascript
详解Node.js中exports和module.exports的区别
2017/04/19 Javascript
js学习总结_轮播图之渐隐渐现版(实例讲解)
2017/07/17 Javascript
Node.js pipe实现源码解析
2017/08/12 Javascript
JavaScript的setter与getter方法
2017/11/29 Javascript
简易Vue评论框架的实现(父组件的实现)
2018/01/08 Javascript
Vuex提升学习篇
2018/01/11 Javascript
解析原来浏览器原生支持JS Base64编码解码
2019/08/12 Javascript
virtualenv实现多个版本Python共存
2017/08/21 Python
Python零基础入门学习之输入与输出
2019/04/03 Python
在Pytorch中使用样本权重(sample_weight)的正确方法
2019/08/17 Python
使用python的pyplot绘制函数实例
2020/02/13 Python
Python制作一个仿QQ办公版的图形登录界面
2020/09/22 Python
Python django框架 web端视频加密的实例详解
2020/11/20 Python
利用python+ffmpeg合并B站视频及格式转换的实例代码
2020/11/24 Python
巧用CSS3的calc()宽度计算做响应模式布局的方法
2018/03/22 HTML / CSS
Canvas制作的下雨动画的示例
2018/03/06 HTML / CSS
使用Html5 Stream开发实时监控系统
2020/06/02 HTML / CSS
上海奥佳笔试题面试题
2016/11/16 面试题
建筑施工安全责任书
2014/07/24 职场文书
酒会邀请函
2015/01/31 职场文书
2015年卫生院健康教育工作总结
2015/07/24 职场文书
小学班主任研修日志
2015/11/13 职场文书
2016年重阳节慰问信
2015/12/01 职场文书
创业项目大全(适合在家创业的项目)
2019/08/15 职场文书
2019升学宴主持词范本5篇
2019/10/09 职场文书
JavaScript流程控制(分支)
2021/12/06 Javascript