LabVIEW 图形化显示数据

原文: https://lv.qizhen.xyz/data_graph

能够方便的把数据以图形化的方式展现出来,是 LabVIEW 的一大特色。LabVIEW 为此提供了丰富的控件和函数,可以大大简化图形化显示数据的复杂度。LabVIEW 图形控件选板上列出了几十种控件,分别用于显示不同类型的数据。但实际上,真正用于显示的部分,不需要分成那么多种控件,比如,一个图片控件既可以显示显示用直角坐标系表示数据,也可以显示用极坐标系表示的数据。所以,读者们可能已经发现了,这个选板上的很多控件被拖到前面板上时,它还会在 VI 的程序框图上添加一些代码。这些代码是真正用来处理不同类型的数据的,它们把不同类型的数据转换为图形控件可以显示的方式,再使用图形控件把数据绘制出来。

images_2/image74.png

这个选板上的大多数控件用来显示二维图形数据,也有一部分控件可以用来显示三维图形数据。

波形图表和波形图
我们先来看两个最常用的数据曲线显示控件:波形图表和波形图控件。所谓曲线就是一组随时间变化的数值数据,曲线常常也被称作波形。LabVIEW 中最常见的曲线格式是在一个直角坐标系中用 X 轴表示时间,Y 轴表示数据值。

图表与图的区别
在图形控件选板上的波形图(Waveform)和强度图(Intensity),都有对应的图表(Chart)和图(Graph)。图表和图区别在于当图表控件自带一块缓存,历史数据会被保存在缓存中。当图表接收到新的数据时,它不会把原来显示的图形清除,而是在原图形基础上再把新数据添加上。图控件没有缓存,每次接收到新的数据,就会把旧图清除,只显示新的数据。

在实际应用中,图表适合显示低速变化的数据,比如某一程序每秒钟读取并显示一次锅炉的温度数据,这个程序可以使用波形图表控就无需逐点显示数据了。比如,程序在 0.01 秒内采集了 1000 个被测物体的震动信号数据,即便可以在 0.01 秒内逐个画出 1000 个点,人眼也无法看到绘图的过程。这种情况更适合在采集完全部 1000 个数据后,使用波形图控件一次绘制出全部数据。

在 VI 前面板上新加一个波形图表控件,会发现它在程序框图上的数据类型是 DBL 的实数数值类型;在 VI 前面板上新加一个波形图控件提供一个数据;波形图控件则每次接受一组数据,然后全部显示出来。比如下图中的程序,绘制了一条带有噪声的正弦波信号。波形信号被分别传递给了一个波形图表和一个波形图控件,但传递方式有所不同:

images_2/image77.png

运行 VI,会看到波形图表和波形图控件最终显示的数据曲线完全相同。区别在于程序的运行过程中,波形图表控件逐点绘制曲线,波形图控件要等到所有数据集齐后才一次绘制所有数据。

images_2/image78.png

这时候如果再次运行 VI,会发现波形图表上的旧数据并没有被清除,而是在后面继续添加的新数据。如果希望每次程序运行时,都是一个全新的开始,可以在程序中通过波形图表的属性节点,清空它的历史数据,之后再添加数据:

images_2/image79.png

我们也可以使用同样的属性节点在程序运行当中,清除波形图表控件的历史数据,或者为它设置一些初始的历史数据。

我们之前介绍的各种控件,大多都是每个控件对应一种数据类型,比如开关控件接受布尔类型的数据,文本框控件采取不同的数据显示方式。

波形图表控件也可以接受数值数组数据,这时,它会一次把输入的一组数据都添加在波形显示区。如果我们把上面的例子稍作修改,在循环外,把生成的数组数据同时传给波形图表和波形图控件,会发现这时候两个控件的行为完全一致:

images_2/image80.png

显示多条波形曲线
波形图表和波形图控件都可以用来显示多条波形曲线,一个直觉的想法是:既然一维数组可以表示一条曲线,那么二维数组就应当二维数组数据传递给波形图表和波形图控件,让他们显示多条曲线,但是需要注意的是,这两个控件接受的二维数组数据是具有不同格式的:

波形图控件接受的二维数组数据中,每一行代表一条曲线,每一列代表一个时刻的数据;
波形图表控件正相反,它接受的二维数组数据中,每一列代表一条曲线,每一行代表一个时刻的数据。
比如下面这个程序,波形图表和波形图控件显示的曲线图案完全相同,但是输入的数据,一个却是另一个的转置:

波形图控件默认状态下,是通过直接修改坐标的起始值来设置 X 轴的时间信息的,所以当我们需要使用波形数据携带的时间信息时,需要把 “忽略波形数据的时间戳(Ignore waveform time stamp on x-axes)” 这个选项取消才行:

images_2/image85.png

程序运行结果如下:

images/image461.png

使用 “设置波形属性” 和 “获取波形属性” 可以读写波形数据中的属性。波形中可以保存一些任意名称和任意类型数据的属性。采集数据时的某些信息,如通道名称、单位、放大倍数等,这些信息在后续的程序中也许还要用到,就可以把它们当作波形数据的属性保存下来,并传给后续形数据中把它们读出来。这两个函数分别有一个名为 “名称” 的输入或输出接线端。在程序中,某些名称的属性具有特殊用途。比如,“NI_ChannelName” 表示通道名称。设置了这个属性,波形图中的通道名称会自动更新。在这两个函数的帮助文件中,可以查看到这些特殊含义的名称属性的详细信息。

images/image462.png

images/image463.png

使用波形数据的一个额外好处是:波形图表和波形图控件可以接受同样格式的数据,并且显示出同样的结果了,比如下面的程序:

images_2/image86.png

程序运行结果:

images_2/image87.png

XY 图形控件(XY Graph)
波形图控件处理的数据有一个特征,它的时间信号是有序等间隔的。对于这种数据,通常只需要用一个一维数组,表示每一个时间点上 Y 轴的数据即可。如果还需要具体的时间数据,也不需要把每个时间点的数据保存下来,只需要一个初始时间值,和一个间隔值即可。些其他类型的曲线,它们的 X 轴可能并不是有序的,或者不是等间隔的。对于这样的数据,就还需要再增加一个一维数组,来表示数据在 X 轴上的每一个数值。这一类由一组对应的 X 和 Y 的值组成的数据,可以使用 XY 图形控件(XY Graph)来显示。

我们通常会用 XY 图形数据来展现两组数据之间的关系。比如,在测控领域,常常用它来展示一组采集数据中两个通道的数据之间的关系;在数据统计或人工智能等领域,常常用它来展示一个数据集中,某个特征量的分布,或者两个特征之间的关系等。

展示两个信号通道之间的关系
下图是一个简单示例,它把相位相差为 90 度的两个正弦波数据分别作为 X 和 Y 轴的数据输入 XY 图形控件:

images_2/image88.png

如果没有噪音,图像应该是一个正圆。因为加入了一些随机数,XY 图形控件显示的是一个带有不规则锯齿的圆圈:

images_2/image89.png

很多示波器具有绘制利萨茹曲线的功能。数学上,利萨茹(Lissajous)曲线(又称利萨茹图形、李萨如图形或鲍迪奇曲线)是两个沿着互相垂直方向的正弦振动的合成的轨迹。使用利萨茹图形可以测量出两个信号的频率比与相位差。在程序里,我们可以使用XY图形控件来绘制利萨茹曲线。下图的程序是一个简单示例,为了简化编程复杂度,程序使用了 Express VI 来生成演示所需的两个通道的正弦波信号,两个通道信号的频率分别为 3Hz 和 4Hz:

images_2/z001.png

输入频率比为 3/4 的两个正弦信号的利萨茹曲线如下:

images_2/z002.png

数据分析
文本文件 “weight_height.csv” 中,收集了一万个人的性别、身高和体重数据。我们猜测,身高和体重数据可能有相关性,需要验证一下,那么我们就可以用身高作为 X 轴,以体重为 Y 轴,把每一个人的身高体重对应的坐标点显示在 XY 图形控件上。这样就可以直观的看出体重相对于身高的分布规律了。XY 图形控件也可以接受多通道数据,所以我们还可以按照性别把数据分为男女两个通道。下图是示例VI的程序框图:

程序首先从 csv 文件中读出数据,程序使用了一个库 VI,“Read Delimited Spreadsheet”。这个 VI 可以读取文本格式的表格数据,再把数据存放在一个二维数组中输出。
然后,程序按照性别把数据整理至4个一维数组中,分别代表:男性身高、男性体重、女性身高、女性体重,
最后分别把男女的数据绑定为两个通道的数据,在 XY 图形数据显示出来。
images_2/image90.png

这个示例中的数据都是离散的,每个人之间的数据都相互独立。所以也不需要有连线,只要在每个有数据的地方画一个点即可。我们可以在 XY 图的设置中修改曲线风格,改成按点显示:

images_2/image91.png

程序使用蓝色代表男性数据,红色代表女性数据。程序运行结果如下图所示:

images_2/image92.png

可以明显的看到数据分布在一条倾斜的狭长地带上,无论单看男性、女性,还是从整体来看,都可以看出身高与体重之间有比较明显的正相群中,身高与体重各自的分布情况,也可以使计处理后的数据。在这里我们使用身高作为 X 轴,在每一身高区间范围内的人数左右 Y 轴,这样就可以看到在身高维度上人数的分布。使用类似的方法,也可以查看人群中不同体重区间内的人数分布。

images_2/image93.png

查看数据在某一维度上的分布常常会使用柱状图,当然,曲线图也可以:

images_2/image94.png

可以看出男女的数据分布虽然有重叠,但峰值部分(最典型的身高和体重)还是明显分开的。

强度图 (Intensity Graph)
XY 图形在每一个坐标点只有两个选项:有数据或者没有数据。但有的时候我们需要在每个坐标点上展示更复杂的信息,不仅表示有没有,还要显示一个量值。这时候数据就从二维变成了三维,除了 X、Y 轴的数值,又添加了一个 Z 轴上的数值。LabVIEW 常用两种方法来显示三维数据,一种方法是使用三维图形控件,但是我们首先介绍一下第二种方法:使用强度图来展示三维数据。强度图依然是一个二维图,与 XY 图有些相似,但是它可以使用像素的亮度或颜色来表示三维数据在 Z 轴上的数值。

时频联合谱图
在测控领域,使用波形图只能表达两维信息量。比如常常用横轴表示时间或频率,而用纵轴表示幅值或能量。但有时候我们需要更复杂的分析方法,比如真实信号的能量在不同频率的分布常常是随着时间变化而改变的。如果要把这一了时频联合分析的功能,即在一张图上以颜色表示声音能量在不同时段和频率上的分布。使用 LabVIEW 编程可以实现同样的功能。下图 是实现这一功能的一段程序。它的实现方法是比较简单的,把声音分成小的片段,比如每秒钟一段,然后分析这一段时间内,声音功率在不同频率上的分布,最后把每一秒钟的分析结果合并在一起,就得到这一数据随时间变化的图谱了。

images/image472.png

在选取时间片长度的时候需要注意:如果时间片选取的太短,时频联合分析结果在频域上的分辨率就会比较低;而如果时间片太长,时频联合分析结果在时域上的分辨率会降低。这两个分辨率是矛盾的,此消彼长。对于音乐和语音来说,一般每秒钟最多包含四五个音节,所以选取每 200 毫秒为一个时间片是比较合适的。

下图是一首钢琴曲的时频能量谱图。从这张图上可以清楚的看出钢琴曲不同音符的跳跃变化。如果需要编写一个程序,把一段音乐转成曲谱,或把录制的电话拨号音还原为电话号码,那么第一步就可以采取上述方式进行时频联合分析。然后得到谱图中高亮部分信号的频率,再将频率转换成相应的音符或电话拨号即可。

images/image473.png

如果把程序改为从声卡或其它数据采集设备中读入数据,就可以对采集到的信号进行实时分析了。

数据分析
在显示身高体重分布的示例中,使用 XY 图,我们只能够分别查看身高的分布或体重的分布。如果想同时观察身高和体重的分布这就需要三维数据了:身高、体重、分布数量,它可以使用强度图来显示,程序如下:

images_2/z004.png

由于 LabVIEW 自带的函数中没有计算二维数据分布图的 VI,这个示例程序稍微麻烦了一点,需要自己计算数据在每个身高体重区间内的分布。我们把身高和体重都各自等分了 2重组成了一个 200*200 的网格,然后把每个人的数据放到相应的网格里。在 XY 图形控件中有亮度来表示每个网格中人数的多少:

images_2/z005.png

上图看上去有点像斜着放的银河系,但是可以看出来,有两个亮度比较明亮的区域区域,分别是男性和女性中最常见的身高体重区域。

图片
整个电脑屏幕的显示本质上也是一种强度图。对于黑白显示屏来说,每个像素有三维数据:横坐标、纵坐标、亮度;对于彩色显示屏来说,是把红绿蓝三个颜色通道的强度图合并在了一起。我们在屏幕上看到的每一个图片也是一个强度图。因此,我们可以把图片再拆分成基本的亮度数据,然后在 LabVIEW 的强度图控件上显示出来。下图中的程序读取了一个图片文件,图片内容是一取图片的 VI 会把图像数据当作一维数组读出,我们需要把它转换回为二维数组的形式。又因为图片是彩色的,而 LabVIEW 每个强度图只能显示一个通道的数据,所以我们需要把数组中的数据拆分成红绿蓝(RGB)三个通道,然后分别送往三个强度图控件显示。

images_2/z006.png

程序运行结果如下:

images_2/z007.png

图片使用的坐标系与 LabVIEW 中二维图形控件使用的坐标系略有不同,LabVIEW 图形控件多是使用的标准的直角坐标系,是把左下角当作原点,向右为 X 轴正向,向上为 Y 轴正向;图片中一般把左上角作为原整读入数据的方向,所以在 LabVIEW 强度图中显示的图片是翻转了 90 度的。与原图对比一下:

images_2/labview.png

三维图形控件
强度图控件不支持多通道数据是因为它毕竟还是二维显示的,如果同时有多个通道的数据,其中一个通道但是我们可以调整三维图像的观察角度。在三维空间里,如果有数据遮挡了另一些数据,调整到合适的观察角度就可以查看那些原本被遮挡的数据。

虽然 LabVIEW 控件选板上有众多三维控件类型,其实它们真正用于显示的都是同一种控件,不同之处只在于用于处理数据的函数。这些函数有些用来在三维控件画点,有的可把点连成线,还有一些可以把点连成面。

三维点图
在三维空间绘制点图与在 XY 图形上绘制点图非常类似,只要提供每一个需要绘制的点的坐标即可。上文为了把两组数据彻底分开,我们可以把性别也作为一个维度(比如女性用 0.1 表示;男性用 0.2 表示),这样每条数据就有了三个维度的值:身高、体重、性别。把每一条数据的三个值传给三维控件,即可绘制出数据在三维空间上的分布:

images_2/z009.png

程序运行结果如下,现在,我们可以拖动三维图,切换角度来看清楚每一处的数据:

images_2/z008.gif

三维曲线
绘制三维曲线与绘制三维点图所需要的数据基本相同,区别仅在于会使用线段把输入数据中每个相邻的点都连接起来。很少有示波器可以绘制三通道茹曲线,但是我们可以编程轻松实现这一功能。下图程序与绘制二维利萨茹曲线的程序非常相似,仅仅是增加了一个通道,现在有三个通道的正弦波信号,频率分别为 2Hz、3Hz 和 4Hz:

images_2/z011.png

程序运行结果如下:

images_2/z010.gif

三维曲面
有一些了程序框图自动整理工具,程序节点排布可能变得整齐了一些,但是程序逻辑似乎更难读懂了。连线编程的方式确实不太适合表达复杂的数学公式,笔者应当使用 公式节点 来编写这个程序:

images_2/z012.png

程序运行结果如下,看上去还挺漂亮的,但是机械感太强,不够真实。

images_2/z013.png

修改三维图形控件的设置:隐藏坐标显示,调节光照和配色:

images_2/z014.png

之后图片看起来有点像真花了:

images_2/z015.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值