用guiqwt制作实时波形绘图程序

转载 2014年08月17日 00:58:01

转自:http://hyry.dip.jp/tech/slice/slice.html/16


guiqwt的pyplot API

PyQwt对Qt平台中的C++绘图扩展库Qwt进行包装,而guiqwt又对PyQwt进行了封装,使它更容易使用。与Python最著名的绘图库matplotlib相比,guiqwt的绘图功能虽然比较有限,然而它最大的优势在于其高效的绘图速度。因此我们可以很方便地使用guiqwt制作出对绘图实时性要求较高的程序。

在guiqwt中甚至还提供了一套与pyplot类似的API,方便快速绘图,下面是一个例子:

import numpy as np
from guiqwt.pyplot import *

t = np.linspace(0, 20, 1000)
u = np.sin(t) + np.random.randn(1000)
i = np.cos(t) + np.random.randn(1000)
subplot(2,1,1)
plot(t, u, "r-", label=u"电压")
xlabel(u"时间(秒)")
ylabel(u"电压(伏特)")
legend()
subplot(2,1,2)
plot(t, i, "g-", label=u"电流")
xlabel(u"时间(秒)")
ylabel(u"电流(安培)")
legend()
title(u"电压-电流")
show()

程序中用到了subplot()、plot()、xlabel()、ylabel()、legend()、title()、show()等函数,它们的用法与matplotlib.pyplot中的同名函数类似。下面是程序的运行界面,由界面截图可知,虽然曲线没有matplotlib的精美,但是它提供了更多的工具按钮和绘图配置功能:

qwtgui_pyplot.png

在PyQt4界面中插入绘图控件

qwtgui最大的用处还是在PyQt4制作的界面程序中使用绘图控件。

import numpy as np
from PyQt4.QtGui import *
from PyQt4.QtCore import Qt
from guiqwt.plot import PlotManager, CurvePlot
from guiqwt.builder import make

class PlotDemo(QWidget):
    def __init__(self):
        super(PlotDemo, self).__init__()
        self.setWindowTitle(u"Plot Demo")
        self.manager = PlotManager(self)  
        self.plot = CurvePlot()           
        self.manager.add_plot(self.plot)  
        self.manager.register_standard_tools()      
        self.manager.get_default_tool().activate()  
        t = np.arange(0, 20, 0.05)
        x = np.sin(t) + np.random.randn(len(t))
        curve = make.curve(t, x, color="red", title=u"正弦波")  
        self.plot.add_item(curve)  
        vbox = QVBoxLayout()
        vbox.addWidget(self.plot)
        self.setLayout(vbox)

要生成一个可交互的曲线图控件,需要三个对象:PlotManager、CurvePlot、CurveItem。其中CurvePlot是曲线图控件;CurveItem是控件中所显示的曲线,它管理曲线X-Y轴的数据;而PlotManager则可以用来管理一个或者多个绘图控件,为其添加各种交互功能。

创建PlotManager对象,创建CurvePlot对象,并调用PlotManager对象的add_plot()将绘图控件添加进管理列表。

添加标准的交互工具,并使其成为当前工具。在绘图控件中,按住鼠标中键拖动可以对图表的显示范围进行平移,按住鼠标右键拖动可以进行缩放。

通过make模块中的curve()创建一个CurveItem对象,它的颜色为红色,标题为u”正弦波”。最后调用CurvePlot对象的add_item()将曲线对象添加进绘图对象的项目列表中。

程序的显示效果如下:

qwtgui_intro.png

X轴范围同步

在实时的数据显示程序中,通常需要多个绘图控件的横轴(时间轴)的范围保持一致,下面的程序实现这一功能:

class SyncXAxisDemo(QWidget):
    def __init__(self):
        super(SyncXAxisDemo, self).__init__()
        self.setWindowTitle(u"Plot Demo")
        t = np.arange(0, 20, 0.05)
        sin1f = np.sin(t)
        sin3f = 1/6.0*np.sin(3*t)
        vbox = QVBoxLayout()
        self.manager = PlotManager(self)
        for i, data in enumerate([sin1f, sin3f, sin1f+sin3f]):
            plot = CurvePlot()
            plot.axisScaleDraw(CurvePlot.Y_LEFT).setMinimumExtent(60) 
            plot.plot_id = id(plot)   
            curve = make.curve(t, data, color="blue")
            plot.add_item(curve)
            vbox.addWidget(plot)
        self.manager.register_standard_tools()
        self.manager.get_default_tool().activate()
        self.manager.synchronize_axis(CurvePlot.X_BOTTOM, self.manager.plots.keys()) 
        self.setLayout(vbox)

程序中,我们用QVBoxLayout将多个CurvePlot控件垂直排列。为了让图表的左边框垂直对齐,通过setMinimumExtent()设置Y轴刻度区域的最小宽度,请读者根据多个图表中最大的Y轴刻度区域调整其参数。在qwtgui 2.1.6中存在一个BUG,使得我们必须在调用manager.add_plot()之后设置被添加的plot控件的plot_id属性为id(plot)。调用PlotManager的synchronize_axis(),让其所管理的所有绘图控件的X轴始终保持一致。synchronize_axis()的第一个参数指定所同步的轴,而第二个参数指定需要同步的绘图控件的id。而PlotManager的plots属性是一个以绘图控件的id为键的字典。

下面是程序的界面截图:

qwtgui_syncxaxis.png

实时波形绘图程序

下面是实时波形绘图程序的界面截图:

qwtgui_realtime.png

在每个绘图控件中都有两条曲线。通过上方的工具条可以控制绘图控件的X轴和Y轴的显示范围。显示范围分为自动和手动,共有三种情况:

  1. 当不勾选“X轴自动调节”时,图表的显示范围可由用户用鼠标改变。
  2. 当勾选“X轴自动调节”,不勾选“Y轴自动调节”时,图表的Y轴显示范围可由鼠标改变,而X轴则显示最新N秒的数据,N由工具条中的数字决定。
  3. 当同时勾选“X轴自动调节”、“Y轴自动调节”时,X轴显示最新N秒的数据,而Y轴自动根据这N秒的数据的范围修改。

程序中使用array模块的动态数组实现数据收集,关于这方面的内容请读者参考: 在NumPy中使用动态数组 。

程序中还使用了 通过降低采样点数快速绘制曲线 中介绍的方法实现绘图控件的快速响应。

http://hyry.dip.jp/tech/code/code/8

实时波形绘图程序的源代码

为了演示实时的效果,程序中采用定时器产生新的数据。而在实际的系统中,数据可能通过串口、AD设备、socket通信等方式获得,由于获得数据所需的等待时间可能较长,因此为了不影响界面的响应,通常需要使用线程或 gevent 中的协程实现数据采集。

Win7 Python guiqwt 开发环境搭建

1. 下载Python3.4 并安装: https://www.python.org/downloads/windows/ 2. 从以下地址下载合适版本的Pyqt5.6并安装,因为从5.6开始...
  • zengxy3407
  • zengxy3407
  • 2017年02月27日 08:50
  • 489

Python中利用guiqwt进行曲线数据拟合

Python中guiqwt是和MatPlotLib一样优秀的2D绘图库,基于PyQt库, 里面有进行曲线数据拟合的专门工具guifit. guifit用起来和matlab中的cftool一样方便, 比...
  • rumswell
  • rumswell
  • 2013年04月19日 18:08
  • 5540

qt超强绘图控件qwt - 安装及配置

qwt是一个基于LGPL版权协议的开源项目, 可生成各种统计图。它为具有技术专业背景的程序提供GUI组件和一组实用类,其目标是以基于2D方式的窗体部件来显示数据, 数据源以数值,数组或一组浮点数等方式...
  • huang446276616
  • huang446276616
  • 2014年02月05日 12:00
  • 19355

python(实操4):录音文件的读取、写入、绘制波形、录音、播放等

Python 进行录音文件的读取、写入、播放、绘制波形,以及录音等功能
  • MoreSpeech
  • MoreSpeech
  • 2017年04月03日 21:16
  • 1448

用python做正弦信号的时域波形和频谱图

用python中的 numpy.fft 完成正弦波形的傅里叶变换并作出时域图和频谱图。
  • matrix_google
  • matrix_google
  • 2017年03月09日 18:05
  • 2222

Python 读取WAV文件并绘制波形图

# -*- coding: utf-8 -*- import wave import pylab as pl import numpy as np # 打开WAV文档 f = wave.open(r"...
  • daiyinger
  • daiyinger
  • 2015年09月08日 13:16
  • 5270

python中PyQwt的使用

python中除了matplotlib外,PyQwt也可以用于画图。前者是基于wxpython,后者是基于PyQt,有异曲同工之妙。 下面是一个小例子: # -*- coding: utf-8...
  • jkhere
  • jkhere
  • 2013年10月19日 21:34
  • 1804

【Qt编程】基于QWT的曲线绘制及图例显示操作

http://blog.csdn.net/tengweitw/article/details/41911035     在《QWT在QtCreator中的安装与使用》一文中,我们完成了QWT的安装,...
  • haluoluo211
  • haluoluo211
  • 2015年06月12日 16:05
  • 2364

使用Qwt绘制历史曲线

一、以时间轴作为横坐标   Qwtplot 默认是以数值作为横坐标进行绘图的,但是像历史曲线这样的曲线图,应该以时间作为横轴才能更好地反映出时间-数值之间一一对应的关系。可是要如何将数值与时间对应起...
  • Blue_White_Space
  • Blue_White_Space
  • 2015年12月23日 16:02
  • 2220

Qwt--散点图/函数图

QwtPlot是用来绘制二维图像的widget。在它的画板上可以无限制的显示绘画组件。绘画组件可以是曲线(QwtPlotCurve)、标记(QwtPlotMarker)、网格(QwtPlotGrid)...
  • wishchin
  • wishchin
  • 2014年07月11日 09:26
  • 3018
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用guiqwt制作实时波形绘图程序
举报原因:
原因补充:

(最多只允许输入30个字)