当前位置: 移动技术网 > IT编程>开发语言>C/C++ > PyQt5结合matplotlib绘图的实现示例

PyQt5结合matplotlib绘图的实现示例

2020年09月16日  | 移动技术网IT编程  | 我要评论
参考网上的例子,实现了简单的matplotlib pyqt5绘图相关知识点: (1)pyqt5中添加控件要在布局中添加 (2)布局可以使用replacewidget替换控件 (3)信号与槽机制time

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

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

timer = qtcore.qtimer(self)
timer.timeout.connect(self.update_figure)

self.btnplot.clicked.connect(self.plotbutton_callback)

实现的效果

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_())

参考链接:

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

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网