基于PyQt Canvas Matplotlib图形绘制

关键技术:变量传递, Pyqt Canvas, 信号槽

定义三种不同的绘图样式:第一个是静态图,第二个是动态图,最后一个是变量可控视图。

		sc = MyStaticMplCanvas(self.main_widget, width=5, height=4, dpi=100)
		dc = MyDynamicMplCanvas(self.main_widget, width=5, height=4, dpi=100)
		cc = MyControlMplCanvas(self.main_widget, width=5, height=4, dpi=100)
		self.horizontalLayout.addWidget(sc)
		self.horizontalLayout.addWidget(dc)
		self.horizontalLayout.addWidget(cc)

 变量传递,通过lambda函数实现。

self.horizontalSlide.valueChanged['int'].connect(lambda: cc.update_figure(self.horizontalSlide.value()))

完整程序: 

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file '.\mainwindow.ui'
#
# Created by: PyQt5 UI code generator 5.6
#
# WARNING! All changes made in this file will be lost!
import sys
import random

import matplotlib
matplotlib.use("Qt5Agg")
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow, QMenu, QVBoxLayout, QSizePolicy, QMessageBox, QWidget

from numpy import arange, sin, pi
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure


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

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

		FigureCanvas.setSizePolicy(self,
									QSizePolicy.Expanding,
									QSizePolicy.Expanding)
		self.axes.set_xlabel('x')
		self.axes.set_ylabel('y')
		FigureCanvas.updateGeometry(self)

	def compute_initial_figure(self):
		pass

class MyStaticMplCanvas(MyMplCanvas):#单个画布
	"""静态画布:一条正弦线"""
	def compute_initial_figure(self):
		t = arange(0.0, 3.0, 0.01)
		s = sin(4*pi*t)
		self.axes.plot(t, s)

class MyControlMplCanvas(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.plot([0, 0, 0, 0], [1, 2, 3, 4], 'r')

	def update_figure(self,x=1):
		# 构建4个随机整数,位于闭区间[0, 10]
		t = arange(0.0, 3.0, 0.01)
		print x
		s = sin(2*pi*t+x/100.*2*pi)
		self.axes.plot(t, s ,'r')
		self.axes.set_xlabel('x')
		self.axes.set_ylabel('y')
		self.draw()

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.plot([0, 1, 2, 3], [1, 2, 0, 4], 'r')

	def update_figure(self):
		# 构建4个随机整数,位于闭区间
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值