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代理抓取并验证使用多线程实现
May 03 Python
Python中使用Queue和Condition进行线程同步的方法
Jan 19 Python
利用Python为iOS10生成图标和截屏
Sep 24 Python
Python实现利用最大公约数求三个正整数的最小公倍数示例
Sep 30 Python
python机器学习理论与实战(五)支持向量机
Jan 19 Python
浅谈关于Python3中venv虚拟环境
Aug 01 Python
python中pip的安装与使用教程
Aug 10 Python
python取数作为临时极大值(极小值)的方法
Oct 15 Python
一行Python代码制作动态二维码的实现
Sep 09 Python
浅谈python锁与死锁问题
Aug 14 Python
Django视图类型总结
Feb 17 Python
Python selenium模拟网页点击爬虫交管12123违章数据
May 26 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
实现分十页分向前十页向后十页的处理
2006/10/09 PHP
php中将地址生成迅雷快车旋风链接的代码[测试通过]
2011/04/20 PHP
php eval函数用法 PHP中eval()函数小技巧
2012/10/31 PHP
yii去掉必填项中星号的方法
2015/12/28 PHP
ThinkPHP框架实现导出excel数据的方法示例【基于PHPExcel】
2018/05/12 PHP
php使用mysqli和pdo扩展,测试对比连接mysql数据库的效率完整示例
2019/05/09 PHP
网站被黑的假象--ARP欺骗之页面中加入一段js
2007/05/16 Javascript
用jquery设置按钮的disabled属性的实现代码
2010/11/28 Javascript
jquery关于图形报表的运用实现代码
2011/01/06 Javascript
vue中动态绑定表单元素的属性方法
2018/02/23 Javascript
vue实现未登录跳转到登录页面的方法
2018/07/17 Javascript
JS实现用特殊符号替换字符串的中间部分区域的实例代码
2018/07/24 Javascript
javascript实现前端成语点击验证优化
2020/06/24 Javascript
在Python中利用Into包整洁地进行数据迁移的教程
2015/03/30 Python
http请求 request失败自动重新尝试代码示例
2018/01/25 Python
pandas数据预处理之dataframe的groupby操作方法
2018/04/13 Python
Python一句代码实现找出所有水仙花数的方法
2018/11/13 Python
解决pyttsx3无法封装的问题
2018/12/24 Python
Django页面数据的缓存与使用的具体方法
2019/04/23 Python
对Python的交互模式和直接运行.py文件的区别详解
2019/06/29 Python
Python3+Appium安装使用教程
2019/07/05 Python
Django ForeignKey与数据库的FOREIGN KEY约束详解
2020/05/20 Python
Python3批量创建Crowd用户并分配组
2020/05/20 Python
关于keras中keras.layers.merge的用法说明
2020/05/23 Python
Python selenium模块实现定位过程解析
2020/07/09 Python
英国领先的珍珠首饰品牌:Orchira
2016/09/11 全球购物
英国天然保健品网站:Simply Supplements
2017/03/22 全球购物
买房子个人收入证明
2014/01/16 职场文书
高一物理教学反思
2014/01/24 职场文书
教师一岗双责责任书
2014/04/16 职场文书
青春奉献演讲稿
2014/05/08 职场文书
社区反邪教工作方案
2014/06/16 职场文书
爱护公共设施倡议书
2014/08/29 职场文书
python中的被动信息搜集
2021/04/29 Python
使用numpy实现矩阵的翻转(flip)与旋转
2021/06/03 Python
使用Redis实现点赞取消点赞的详细代码
2022/03/20 Redis