Download presentation
Presentation is loading. Please wait.
Published byCorey Singleton Modified 6年之前
1
第六章 图 形 基 础 6.1 概述 6.2 基本二维绘图 6.3 格式化绘图 6.4 特殊图形函数 6.5 基本三维绘图
第六章 图 形 基 础 6.1 概述 6.2 基本二维绘图 6.3 格式化绘图 6.4 特殊图形函数 6.5 基本三维绘图 6.6 保存和输出图形 6.7 数据插值和曲线拟合 6.8 本章小节
2
6.1 概 述 数据的可视化是MATLAB的强大功能之一,而这仅仅是MATLAB图形功能的一部分,MATLAB的图形功能主要包括数据可视化、创建用户图形界面和简单数据统计处理等,其中,数据的可视化不仅仅是二维的,还可以在三维空间展示数据,而数据或者图形的可视化也是进行数据处理或者图形图像处理的第一步骤。 MATLAB的图形都是绘制在MATLAB的图形窗体中的,而所有图形数据可视化的工作也都以图形窗体为主。MATLAB图形窗体如图6-1所示。
3
图6-1 MATLAB的图形窗体
4
MATLAB的图形窗体主要包括如下几个部分:
* 工具条:图形窗体的工具条用来完成对图形对象的一般性操作,例如新建、打开、保存和打印,还有对图形窗体的编辑也是通过该工具条完成的。 * 绘图区域:图形窗体的绘图区域是面积最大的一部分,在图6-1中就是绘制了MATLAB标志的矩形区域。在这个区域中可以绘制各种曲线,显示图形图像文件,以及完成对图形图像或者曲线的编辑。
5
一般地,在MATLAB中进行数据可视化的过程主要有如下步骤:
* 设置曲线的属性,例如线型、线宽等。 * 设置绘图区域的属性,并且添加数据网格线。 * 为绘制的图形添加标题、轴标签或者标注文本等。 * 打印或者导出图形。
6
6.2 基本二维绘图 基本绘图指令 在MATLAB中进行数据可视化使用最频繁的绘制函数就是plot函数,该函数能够将向量或者矩阵中的数据绘制在图形窗体中,并且可以指定不同的线型和色彩。同一个plot函数不仅能够绘制一条曲线,还可以一次绘制多条曲线。 plot函数的基本使用语法格式为 绘制一条曲线:plot(xdata, ydata, 'color_linestyle_marker') 绘制多条曲线:plot(xdata1, ydata1, 'clm1', xdata2, ydata2, 'clm2', )
7
例子6-1 MATLAB基本绘图指令的使用。 在MATLAB命令行窗口中键入下面的指令: >> x = 0:pi/1000:2*pi; >> y = sin(2*x+pi/4); >> plot(x,y) 例子6-1共有三条指令,前面两条是准备绘制的数据,x和y两个变量为长度相同的行向量,其中y是利用三角函数处理的数据。而plot函数使用默认的设置将数据x和y绘制在图形窗体中。系统默认的设置为蓝色的连续线条。绘制的图形如图6-2所示。
8
图6-2 在MATLAB图形窗体中绘制蓝色曲线
9
plot函数能够同时绘制多条曲线,在MATLAB命令行窗口中,键入下面的指令:
(继续前面的指令) >> plot(x,y,x,y+1,x,y+2)
10
图6-3 绘制多条曲线
11
在图形窗体中,由下至上分别为绘制的第一、二、三条曲线,根据系统的默认设置分别为蓝色、绿色和红色。
例子6-1说明了plot函数的基本用法,同时也说明了plot函数的系统默认设置。不过例子中使用的数据是两个向量,分别作为X轴的数据和Y轴的数据。那么对于MATLAB是如何处理的呢? 利用plot函数可以直接将矩阵的数据绘制在图形窗体中,这个时候plot函数将矩阵的每一列数据作为一条曲线绘制在窗体中,如例子6-2所示。
12
例子6-2 利用plot函数绘制矩阵数据。 在MATLAB命令行窗口中,键入下面的指令: >> A = pascal(5) A = >> plot(A)
13
第五列数据 第一列数据 图6-4 绘制矩阵的数据
14
设置曲线的样式属性 为了能够在plot函数中控制曲线的样式,MATLAB预先设置了不同的曲线样式属性值,分别控制曲线的色彩、线型和标识符,在表6-1中对plot函数的标识符进行了总结。
15
表6-1 plot函数的标识符
16
例子6-3 设置曲线的样式。 在MATLAB命令行窗口中,键入下面的指令: >> t = 0:pi/20:2*pi; >> y = sin(t); >> y2 =sin(t-pi/2); >> y3 = sin(t-pi); >> plot(t,y,'-.rv',t,y2,'--ks',t,y3,':mp')
17
例子6-3在同一个图形窗体中绘制三条不同的曲线,为了区分这些曲线,使用了不同的时标、色彩和线型,绘制的曲线如图6-5所示。
图6-5 使用不同的样式绘制曲线
18
提示:常用的绘图命令 为了能够更加直观地观察数据曲线,可以使用grid命令将轴的坐标线绘制出来,具体的做法为grid on。 执行该命令后,图形窗体的轴将显示坐标网格线,图6-6就是将例子6-3的结果添加上坐标网格线之后的效果。
19
图6-6 绘制坐标网格线
20
若不希望出现坐标网格线,则可以执行grid off命令。执行grid命令,图形窗体的轴将在有网格线和无网格线之间切换。
若需要向已经存在曲线的图形窗体中增加曲线,则可以使用hold on命令锁定当前的图形窗体,之后所有绘图操作的结果都会显示在当前的图形窗体中。使用hold off命令则解除锁定状态,这时候任何绘图操作都将清除当前图形窗体已经绘制的内容。单纯使用hold命令则将在锁定与非锁定状态之间切换。 清除当前图形窗体内容的指令为clf。创建新的图形窗体的指令为figure。
21
若不希望将绘制的曲线点连接起来,则在使用plot函数绘制曲线的时候不要指定线条的样式,仅指定时标选项和色彩选项,这时就不会将绘制的点用线连接起来了。例如接例子6-3执行下面的指令:
>> plot(t,y,'rv',t,y2,'ks',t,y3,'mp') >> grid on 得到的图形如图6-7所示。
22
图6-7 仅绘制曲线点
23
MATLAB还允许对利用plot函数绘制的曲线进行更细致的控制,不过需要通过设置曲线的属性来完成。MATLAB图形对象都有自己的属性,通过修改属性就可以修改图形曲线的外观,这也是句柄图形和图形用户界面操作图形对象的方法。绘制曲线时,可以通过修改下列属性完成对曲线细节的设置: * LineWidth:曲线的宽度,单位为point。 * MarkerEdgeColor:曲线时标边缘的色彩。 * MarkerFaceColor:填充曲线时标的色彩。 * MarkerSize:曲线时标的大小,单位为point。
24
例子6-4 设置曲线的细节属性。 在MATLAB命令行窗口中,键入下面的指令: >> x = -pi:pi/10:pi; >> y = tan(sin(x)) - sin(tan(x)); >> plot(x,y,'--rs','LineWidth',2,... 'MarkerEdgeColor','k',... 'MarkerFaceColor','g',... 'MarkerSize',10) 例子6-4中设置了曲线的线宽、Marker的填充色、边缘色等属性,于是得到的绘图结果如图6-8所示。
25
图6-8 设置曲线的细节属性
26
使用子图 MATLAB的图形窗体中不仅可以包含一个轴,还可以划分为多个图形显示区域,每个图形显示区域彼此独立,用户可以根据自己的需要把数据绘制在指定的区域中,这种特性就是利用MATLAB图形窗体的子图功能来完成的。使用子图的方法非常简单,只要使用subplot函数选择绘制区域即可。 subplot函数把现有的图形窗体分割成指定行数和列数的区域,在每个区域内都可以包含一个绘图轴,利用该函数选择不同的绘图区,然后所有的绘图操作都将结果输出到指定的绘图区中。
27
subplot函数的基本用法如下: subplot(m,n,p) 其中,m和n为将图形窗体分割成的行数和列数,p为选定的窗体区域的序号,以行元素优先顺序排列。 例如,在MATLAB命令行窗口中键入指令: >> subplot(2,3,4) 则MATLAB将图形窗体分割成为二行三列,并且将第四个绘图区域设置为当前的绘图区域。例子6-5说明了子图的使用方法。
28
例子6-5 使用子图——subplotex.m。
001 function subplotex 002 % 子图的使用示例 003 x = 0:.1:2*pi; 004 % 创建新的图形窗体 005 figure(1);clf; 006 % 分隔窗体为2行2列,分别在不同的区域绘图 007 subplot(2,2,1);plot(1:10);grid on; 008 subplot(2,2,2);plot(x,sin(x));grid on; 009 subplot(2,2,3);plot(x,exp(-x),'r');grid on; 010 subplot(2,2,4);plot(peaks);grid on;
29
011 % 子图的使用特别的用法 012 % 创建新的图形窗体 013 figure(2);clf 014 % 图形窗体分割为4行5列,选择第2~4号区域 015 subplot(4,5,2:4);plot(1:10);grid on; 016 % 选择向量中指定的区域 017 subplot(4,5,[ ]);plot(peaks);grid on; 018 % 选择单一的区域 019 subplot(4,5,11);plot(membrane);grid on; 020 % 选择多个区域 021 subplot(4,5,16:20);surf(membrane);grid on;
30
注意在例子6-5中,选择多个绘图区域时使用的subplot函数的格式。
运行例子6-5的代码,在MATLAB命令行窗口中,键入下面的指令: >> subplotex 则MATLAB创建两个图形窗体,分别绘制分割的图形,如图6-9、6-10所示。
31
图6-9 例子6-5 代码007行~010行的图形结果
32
图6-10 例子6-5代码014行~021行的图形结果
33
控制绘图区域 所谓MATLAB的绘图区域是指图形窗体中的轴(Axes),需要牢记一点,所有MATLAB的图形对象都是绘制在轴的上面,所以控制绘图的区域也就是控制轴的显示区域。利用MATLAB的图形功能绘制图形时,MATLAB自动地根据绘制的数据调整轴的显示范围,它能够保证将所遇的数据以适当的比例显示在轴中。用户同样可以修改轴显示的范围,而且还可以修改轴的标注,修改这些特性需要使用axis函数,并且设置相应的属性。
34
axis函数可以修改图形窗体轴的范围,它的基本语法格式如下:
axis([xmin xmax ymin ymax]) 其中,xmin和xmax决定X轴的显示范围,ymin和ymax决定Y轴的显示范围。 若在MATLAB命令行窗口中,直接键入下面的指令: >> axis ans = 则MATLAB按照默认的设置自动创建一个图形窗体,包含一个空白的轴,其中X轴的范围和Y轴的范围都为0~1。
35
例子6-6 axis函数使用示例。 在MATLAB命令行窗口中,键入下面的指令: >> x = 0:pi/100:pi/2; >> y = tan(x); >> plot(x,y,'ko') >> grid on
36
图6-11 自动比例设置的图形窗体内容
37
可以看出,由于默认的图形窗体轴能够根据数据的范围自动调节图形显示的比例,所以图6-11显示的结果并不是那么直观,绘制的数据几乎排成了一条直线,所以需要修改显示范围。
>> axis([0,pi/2,0,5]) 该命令将图形窗体轴的范围缩小,这时,前面数据的细节就可以很容易地查看出来了,如图6-12所示。 axis函数除了能够用来直接设置轴的范围外,还能够用来设置轴的行为,例如设置轴是否按照数据的范围自动调节等,具体的用法请参阅MATLAB的帮助文档或者在线帮助。
38
图6-12 设置轴的属性以查看数据的细节
39
绘制曲线的轴还需要设置坐标线之间的间隔(Ticks),在默认的情况下,MATLAB按照绘制数据的范围设置坐标线的间隔,这种间隔的设置是自动完成的,用户也可以根据自己的需要设置这些间隔,具体的方法是通过设置轴的XTick或者YTick属性实现对X轴或者Y轴的坐标间隔设置,这里举例说明。
40
例子6-7 设置轴的坐标间隔。 在MATLAB命令行窗口中,键入下面的指令: >> x = -pi:pi/10:pi; >> y = cos(x); >> plot(x,y,'-r^'); >> grid on
41
默认的X轴间隔 图6-13 绘制曲线使用默认的坐标线间隔
42
修改轴的坐标间隔属性,需要使用set函数修改指定对象的XTick或者YTick属性值。在本例子中,修改X轴的范围和坐标间隔:
>> axis([-pi,pi, -inf,inf]) >> set(gca,'XTick', -pi:pi/4:pi) 这时MATLAB的图形窗体如图6-14所示。
43
自定义的X轴间隔 图6-14 设置坐标间隔线和坐标范围
44
注意: 在设置坐标轴的范围时,若将坐标轴取值设定为inf(如例子6-7),则表示该坐标轴的范围为自动,也就是说,在本例子中X轴的范围为[-π,π],则Y轴按照绘制数据的范围自动设定。 提示: set函数和get函数是用来设置/获取MATLAB图形对象属性的常用函数。MATLAB的图形对象都包含有不同的属性和相应的属性数值,这些属性和属性值直接决定了MATLAB图形对象的表现形式。例如在例子6-7中设置了轴对象的属性——XTick,修改之后X轴的坐标间隔发生了变化。
45
继续例子6-7,在MATLAB命令行窗口中键入下面的指令:
>> label = {‘-pi','',‘-pi/2','','0','','pi/2','','pi'} label = Columns 1 through 6 '-pi' '' ‘-pi/2' '' '0' '' Columns 7 through 9 'pi/2' '' 'pi' >> set(gca,'XTickLabel',label)
46
自定义X轴标注 图6-15 设置X轴的标注
47
图形编辑器 MATLAB不仅能够显示数据和图形,而且还可以利用图形窗体中的工具对图形对象进行编辑,这时的图形窗体需要进入到编辑模式。在编辑模式下,可以向图形窗体中的对象添加文本、箭头、直线等,还可以利用MATLAB提供的编辑工具完成图形对象的编辑工作。 进入图形编辑模式有以下几种方法: * 执行图形窗体中“Tool”菜单下的“Edit Plot”命令。 * 单击图形窗体工具栏中选择对象按钮壁 。
48
* 执行“Edit”菜单下的菜单命令或者“Insert”菜单下的菜单命令都可以进入编辑 模式。
* 在MATLAB命令行窗口中,键入“plotedit”指令。 进入图形编辑模式后,可以向图形添加各种元素,完成工作后,只要单击按钮就可以回到正常的显示模式。 图形编辑模式下比较重要的工作是设置各种图形对象的属性,这里以设置轴对象的属性为例来说明这一过程。
49
例子6-8 利用图形编辑模式编辑轴对象属性。 本例子使用例子6-7的指令绘制基本的图形,请参阅例子6-7和图6-13。 首先进入图形编辑模式,利用前面介绍的不同方法都能够进入编辑模式,进入编辑模式后,用鼠标单击轴,这时图形窗口如图6-16所示。
50
图6-16 进入图形编辑模式,并选择轴对象
51
这时可以利用不同的方式打开轴对象的属性编辑器:
* 执行“Edit”菜单下的“Axes Properties”命令。 * 执行鼠标右键快捷菜单下的“Properties”命令。 * 在MATLAB命令行窗口中键入指令propedit,在弹出的图形属性对话框中选择轴 对象。 轴对象的属性编辑器如图6-17所示。
52
图6-17 轴属性编辑器
53
在轴属性编辑器中,可以设置X、Y和Z轴的属性,以及有关绘图的其他属性。这里需要将X轴的属性设置成例子6-7的数值。需要修改的地方包括Limit、Tick和Labels。
修改完毕,单击“Apply”按钮就可以得到结果,如图6-18所示。
54
图6-18 设置轴对象属性得到的结果
55
注意: 在设置Tick属性时,输入到文本框中的内容为-pi:pi/4:pi,然后MATLAB会自动计算得到相应的数值,所以在属性编辑对话框中看到了实际的数值向量。 在图形编辑模式下可以将图形窗体中的对象直接删除、复制和粘贴。注意,这里的删除操作无法回退,也就是说图形对象的删除操作不能恢复。而复制和粘贴图形对象的时候,首先选择需要复制的图形对象,然后利用快捷键Ctrl+C将图形对象复制,接着新建一个图形窗体,在图形窗体的编辑模式下,利用快捷键Ctrl+V将图形粘贴到新的窗体中。注意,复制和粘贴图形对象的过程一定要在图形编辑模式下才能够完成。
56
6.3 格 式 化 绘 图 增加文本信息 MATLAB图形窗体的文本信息主要包括图形标题、文本注释、轴标签和图例等,图6-19中的MATLAB图形窗体包含了所有这些文本信息。 为图形窗体增加这些文本信息一般有多种途径,或者通过菜单命令,或者通过属性编辑器,或者使用MATLAB提供的函数。MATLAB的图形窗体Insert菜单下包含多个菜单命令可以用来添加这些格式化的文本信息,而通过MATLAB图形编辑器,配合不同对象的属性编辑器也可以完成添加格式化文本信息的工作。不过这些方法都没有利用函数编写程序简便、灵活,所以在本书中,重点介绍利用函数添加格式化文本信息的方法。
57
图6-19 MATLAB图形窗体的格式化文本
58
1.添加标题(title) 添加图形的标题需要使用title函数,该函数的基本用法为 title('string') 其中,字符串string为图形窗体的标题,该标题将被自动地设置在轴的正中顶部,例如在MATLAB命令行窗口中,键入下面的指令: >> title(date) 则MATLAB会创建包含一个空白轴的图形窗体,同时将轴的标题设置为当前的日期,如图6-20所示。
59
图6-20 以当前日期为标题的轴 轴的标题
60
2.添加图例(legend) 图例作为绘制在轴的数据曲线的说明,默认绘制在轴的右上角处,其中包括了绘制在轴内曲线的色彩、样式和时标,同时在绘制图例的地方为每一个曲线添加简要的说明文字,便于用户了解数据曲线的信息。添加轴的图例需要使用函数legend,该函数的基本语法为 legend('string1', 'string2'......) 其中,字符串string1、string2为图例的说明性文本,MATLAB将自动地按照绘制在轴上的曲线的绘制次序选择相应的文本作为图例。例如,假设在图形窗体上绘制如例子6-3所示的三条曲线,为这三条曲线增加图例。在MATLAB命令行窗口键入下面的指令: >> legend('y=sin(t)','y=sin(t-pi/2)','y=sin(t-pi)')
61
图例 图6-21 增加图例
62
通过图例可以非常方便地了解绘制在图形窗体中的曲线的基本信息。图例所在的位置可以任意地挪动,可以用鼠标直接在图形窗体中移动图例的位置,也可以在创建图表的时候,直接利用legend函数设置图表的不同位置。具体的方法请参阅MATLAB的帮助文档中关于legend函数的说明。另外,还可以使用句柄图形的方法设置图例的位置。
63
3.添加坐标轴标签(label) 在MATLAB中坐标轴的标签可以用来说明与坐标轴有关的信息,坐标轴标签也可以包含各种需要添加的信息,例如坐标轴数据的单位、物理意义等。MATLAB可以为不同的坐标轴添加不同的坐标信息,一般地,可以使用xlabel、ylabel和zlabel函数分别为图形窗体的X轴、Y轴和Z轴添加轴标签。以X轴为例,这三个函数的基本使用语法如下: xlabel('string') 其中,string就是坐标轴的标签。坐标轴的标签自动与坐标轴居中对齐。
64
例如在图形窗体中为X轴和Y轴添加标签: >> plot(sin(0:pi/100:pi)) >> xlabel('X轴数据');ylabel('Y轴数据') 添加标签之后的图形窗体内容如图6-22所示。
65
坐标轴标签 图6-22 添加坐标轴标签
66
4.添加文本注释(text) 文本注释是由创建图形的用户添加的说明行文字,这些文字可以用来说明数据曲线的细节特点,比如,需要特别注意的数据点。创建文本注释的时候可以将文本注释首先保存在元胞数组中,然后使用text函数完成向图形窗体添加文本注释的工作。 text函数的基本语法为 text(x, y, 'string') 其中,x和y是文本注释添加的坐标值,该坐标值使用当前轴系的单位设置,这个坐标也就是文本起始点的坐标。
67
例如可以向图形窗体添加文本: >> x = 0:.1:2*pi;y = sin(x);plot(x,y) >> text(pi/3,sin(pi/3), '<--Sin(\pi/3)') 这里通过调用text函数,把文本注释添加到了图形曲线上,如图6-23所示。
68
文本注释 图6-23 添加文本注释
69
格式化文本标注 在6.3.1小节的例子中添加的各种文本标注都使用了系统默认的字体、字号等属性设置,若是所有的图形文本注释都使用这些格式未免显得千篇一律了,所以这些文本的属性也可以进行修改,修改这些属性可以通过set命令,而前提是需要获取相应图形对象的句柄。句柄图形已经超出了本书的讨论范围,有兴趣的读者可以参阅MATLAB的帮助文档。在本小节介绍创建格式化文本标注的方法。
70
文本标注的字体属性可以在创建文本标注的时候进行设置,其中有关字体本身的属性包括:
* FontName:字体名称,例如Courier、隶书等。 * FontSize:字体大小,整数值,默认为10 points。 * FontWeight:设置字体的加粗属性。 * FontUnits:字体大小的度量单位,默认为point。 可以在创建文本注释的同时就设置这些文本相应的属性值,在例子6-9中,分别设置了文本注释的这些属性。
71
例子6-9 添加格式化的文本信息——txtinfo.m。
001 %使用不同的文本标注属性 002 % 准备数据并绘制曲线 003 x = 0:.1:2*pi;y = sin(x);plot(x,y) 004 grid on;hold on 005 plot(x,exp(-x),'r:*'); 006 % 添加标注 007 title('2-D Plots','FontName','Arial','FontSize',16) 008 % 使用中文字体
72
009 xlabel('时间','FontName','隶书','FontSize',16)
010 % 加粗文本 011 ylabel('Sin(t)','FontWeight','Bold') 012 % 修改字号 013 text(pi/3,sin(pi/3), '<--Sin(\pi/3)','FontSize',12) 014 legend('Sine Wave', 'Decaying Exponential') 015 hold off 执行脚本文件txtinfo,在MATLAB命令行窗口中键入下面的指令: >> clear all >> txtinfo
73
得到的图形输出如图6-24所示。 图6-24 设置不同文本属性的文本标注
74
特殊字符标注 在6.3.1小节和例子6-9中,都使用了特殊的字符集来显示字符π,而显示字符π的方法就是利用了LaTeX字符集。利用这个字符集和MATLAB文本注释的定义,就可以在MATLAB的图形文本标注中使用希腊字符、数学符号或者上标和下标字体等。 提示: 在MATLAB可用的LaTeX字符集在附录B中可以查到。
75
在MATLAB图形窗体的所有文本标注中都可以使用这些特殊的文本,比如在标题、坐标轴标签、文本注释中,使用特殊文本时一定要注意不要忘记“\”符号,否则MATLAB就会按照普通文本处理这些字符。除了直接使用附录中的LaTeX字符集外,还可以用下面的标识符组合完成更丰富的字体标注。 * \bf:加粗字体。 \it:斜体字。 * \sl:斜体字(很少使用)。 * \rm:正常字体。 * \fontname{fontname}:定义使用特殊的字体名称。 * \fontsize{fontsize}:定义使用特殊的字体大小,单位为FontUnits。
76
设置字体的大小或者名称将直接影响接在定义符后面的文本内容,直到下一个字体定义符出现。
进行上标或者下标文本的注释需要使用“_”和“^”字符。进行上标标注的方法如下: {superstring} 其中,superstring是上标的内容,它必须添加在大括号“{}”之中。 进行下标标注时的标注方法如下: _{substring} 其中,substring是下标的内容,它必须添加在大括号“{}”之中。 关于在MATLAB文本标注中添加特殊的文本的具体方法参见例子6-10。
77
例子6-10 使用特殊文本标注——Latex_examp.m。
001 function latex_examp 002 %LATEX_EXAMP 在文本注释中使用特殊文本 003 alpha = -0.5; 004 beta = 3; 005 A = 50; 006 t = 0:.01:10; 007 y = A*exp(alpha*t).*sin(beta*t); 008 % 绘制曲线 009 plot(t,y); 010 %添加特殊文本注释
78
011 title('\fontname{隶书}\fontsize{16}{隶书} \fontname{Impact}{Impact}')
012 xlabel('^{上标} and _{下标}') 013 ylabel('Some \bf粗体\rm and some \it{斜体}') 014 txt = {'y = {\itAe}^{\alphax}sin(\beta\itt)',... ['\itA\rm' ,' = ',num2str(A)],... ['\alpha = ',num2str(alpha)],... ['\beta = ',num2str(beta)]}; 018 text(2,22,txt ); 运行例子6-10,在MATLAB命令行窗口中键入指令: >> latex_examp
79
图6-25 使用特殊文本注释
80
特殊文本注释可以放置在各种文本注释的内容中,在例子6-10中,011~018行的代码分别在标题、坐标轴标签、文本注释内容中添加了特殊文本。注意,在需要添加多行文本注释的时候,需要将注释的内容保存在元胞数组中,元胞数组的每一个元胞即为注释的一行,就像014行创建的变量txt一样。
81
简单数据统计信息 MATLAB的图形窗体同时提供了简单数据统计的功能,这些功能是通过调用MATLAB的基本数学函数完成的。不过在图形窗体中使用数据统计功能,可以将统计的结构直接绘制在MATLAB图形窗体中,而且这些结果也能够保存到MATLAB的工作空间。本小节通过一个例子来介绍简单数据统计工具的基本用法。
82
例子6-11 简单数据统计工具的基本用法。 本例子使用的脚本文件为census_stats.m,该文件的内容如下: 001 % CENSUS_STATS 简单数据统计工具使用示例 002 % 加载数据,数据为MATLAB自带的DEMO 003 load census; 004 % 绘制曲线 005 plot(cdate,pop,'ko'); 006 hold on;grid on; 007 legend('人口'); 008 title('人口普查信息'); 009 xlabel('时间(年)'); ylabel('人口数(百万)');
83
提示: 本例子使用的数据来自于MATLAB自带的Demo,关于该MATLAB自带例子的信息请参阅在线帮助:help census。 在MATLAB命令行窗口中,键入下面的指令: >> census_stats 这时得到的图形窗体内容如图6-26所示。
84
人口数(百万) 图6-26 人口数据绘图
85
为了进行简单数据统计,需要通过菜单命令。执行图形窗体“Tool”菜单下的“Data Statistics”命令,弹出数据统计对话框,如图6-27所示。
图6-27 数据统计对话框
86
在数据统计对话框中,对X轴和Y轴的数据进行了简要的统计计算,其中包括了最大值、最小值、均值、中值、标准差和取值范围。通过选择每一组数据边上的复选框,就可以将不同的统计计算结果绘制在图形窗体中,比如在例子6-11中选择Y轴数据的均值(mean),这时的图形窗体如图6-28所示。
87
图6-28 添加数据统计信息
88
依此类推,可以将其他的统计结果绘制在图形中。
单击数据统计对话框中的“Save to workspace”按钮可以将统计计算的结果保存到工作空间,在弹出的对话框中选择Y轴的数据,并且编辑变量名,如图6-29所示。
89
图6-29 将统计结果保存到工作空间中
90
保存到工作空间的变量是一个结构: >> whos Name Size Bytes Class cdate x double array censusstats x struct array pop x double array Grand total is 54 elements using 1128 bytes >> censusstats censusstats =
91
min: max: mean: median: std: range:
92
关闭图形窗体的同时自动关闭数据统计工具。若图形窗体中绘制有多条曲线,则可以通过选择数据统计工具对话框的“Statistics for”下拉框中的不同数据进行统计分析。而且,一旦打开数据统计工具对话框,则统计工具自动对图形窗体中的数据进行更新计算,若修改了图形窗体中的曲线,则统计工具自动重新进行计算,并绘制结果。
93
6.4 特殊图形函数 特殊坐标轴系 MATLAB为数据的2D图形显示提供了很多函数,以下函数都是基本二维画线的函数,它们采用了不同的坐标刻度——对数坐标系。因此在绘制特殊坐标轴系曲线的时候,需要分别使用不同的函数: * loglog:两个坐标轴都使用对数刻度。 * semilogx:x轴用对数刻度,y 轴用普通线性刻度。 * semilogy:y轴用对数刻度,x轴用普通线性刻度。
94
还有一个plotyy函数,它能够将两组不相关的数据绘制在同一个图形窗体中,而且每一组数据都使用不同的Y坐标系。
例子6-12 使用特殊的坐标轴系。 执行包含下列代码的脚本文件: 001 %OTHER_AXES特殊坐标系示例 002 data = 1:1000; 003 subplot(2,2,1);loglog(data);grid on; 004 title('LOGLOG(1:1000)') 005 subplot(2,2,2);semilogy(data);grid on;
95
006 title('SEMILOGY(1:1000)'); 007 subplot(2,2,3);semilogx(data);grid on; 008 title('SEMILOGX(1:1000)') 009 subplot(2,2,4);plotyy(data,data,data,data.^2); 010 grid on; 011 title('PLOTYY');
96
图6-30 使用特殊的坐标轴系
97
绘制特殊图形 在MATLAB中能够绘制的特殊图形包括条状图和面积图、饼图、柱状图、离散数据图、矢量方向图以及等高线图等,这些特殊图形的绘制一般都是通过一个函数的调用完成的。不同的特殊图形绘制函数应用面不同,需要根据特殊的数据可视化和统计要求选择。本小节涉及的绘图函数种类众多,在此仅能给出部分函数的用法示例,而无法一一详细解释其语法和用法,请读者注意查阅MATLAB的帮助文档或者使用MATLAB的在线帮助。
98
1.条状图和面积图 绘制条状图和面积图的函数如下: * bar:绘制二维条状图,将m行n列的矩阵绘制成m组,每组n个垂直条(bar)。 * barh:绘制二维水平条状图,将m行n列的矩阵绘制成m组,每组n个水平条(bar)。 * bar3:绘制三维条状图,将m行n列的矩阵绘制成m组,每组n个垂直条(bar)。 * barh3:绘制三维水平条状图,将m行n列的矩阵绘制成m组,每组n个水平条(bar)。 * area:绘制面积图,将向量数据绘制成面积图。
99
执行包含下面代码的脚本文件能够得到如图6-31所示的结果。
001 %BAR_EXAMP条状图和面积图示例 002 data = [ ; ; ; ; ]; 003 subplot(2,2,[1 2]);bar(data); 004 title('垂直条状图(2D)'); 005 subplot(2,2,3);bar3h(data); 006 title('水平条状图(3D)'); 007 subplot(2,2,4);area(data); 008 title('面积图');
100
图6-31 条状图和面积图示例
101
2.饼图 饼图用来显示向量或者矩阵元素占所有元素和的百分比。饼图也有二维饼图和三维饼图,绘制的函数分别为pie和pie3。 执行包含下面代码的脚本文件能够得到如图6-32所示的结果。 001 %PIE_EXAMP 饼图示例 002 A = sum(rand(5,5)); 003 subplot(2,2,1);pie(A); 004 title('完整饼图(2D)'); 005 subplot(2,2,2);pie3(A); 006 title('完整饼图(3D)'); 007 B = [ ];
102
008 subplot(2,2,3),pie(B); 009 title('缺角饼图(2D)'); 010 subplot(2,2,4),pie3(B); 011 title('缺角饼图(3D)');
103
图6-32 饼图示例
104
3.柱状图 柱状图(直方图)用来显示数据的分布情况,比如显示一组数据的概率分布情况。柱状图可以绘制在普通的直角坐标下,也可以绘制在极坐标下,使用的函数分别为hist和rose。这两个函数分别计算输入向量中数据落入某一范围的数量,而绘制的柱状高度或者长度则表示落入该范围的数据的个数。 执行包含下列代码的脚本文件能够得到如图6-33所示的结果。 001 %HIST_EXAMP 柱状图示例 002 A = randn(100000,1); 003 B = rand(100000,1);
105
004 subplot(2,2,1);hist(A); 005 title('正态分布'); 006 subplot(2,2,2);hist(B); 007 title('均匀分布'); 008 subplot(2,2,3);rose(A); 009 title('正态分布'); 010 subplot(2,2,4);rose(B); 011 title('均匀分布');
106
图6-33 柱状图示例
107
4.离散数据图 在数字信号处理领域经常处理一些离散的数据,而MATLAB提供了相应的函数供用户进行离散数据的绘制,例如常用的火柴杆图、阶梯图等。前面介绍的柱状图也是绘制离散数据的一种选择。 绘制火柴杆图可以使用stem函数或者stem3函数,前者绘制二维空间的曲线,后者绘制三维空间的曲线,而阶梯图需要使用stairs函数。 例如绘制离散数据图的脚本文件——stem_examp如下:
108
001 %STEM_EXAMP离散数据图示例 002 alpha = .01; beta = .5; t = 0:0.2:10; 003 y = exp(-alpha*t).*sin(beta*t); 004 stem(t,y,'r');grid on;hold on; 005 stairs(t,y,'g'); 006 plot(t,y,'b'); 007 figure 008 theta = 2*pi*(0:127)/128; 009 x = cos(theta); 010 y = sin(theta); 011 z = abs(fft(ones(10,1), 128))'; 012 stem3(x, y, z)
109
图6-34 离散数据图示例
110
注意: 在绘制三维火柴杆图的时候使用了快速傅立叶函数,该函数是数字信号处理常用的函数之一,为MATLAB的内建函数。 除了上述四种类型的特殊绘图函数以外,MATLAB还能够绘制矢量方向图和等高线图,这些函数包括 * compass :绘制放射线图。 * feather:绘制线性放射线图。 * quiver:绘制场图。 * quiver3:绘制三维场图。
111
* contour:绘制等高线轮廓图。 * contour3:绘制三维等高线轮廓图。 * contourf:绘制填充的等高线图。 * clabel:标识等高线标签。 * meshc:绘制三维mesh曲线和等高线。 * surfc:绘制三维surf曲线和等高线。
112
例如使用上述函数绘制特殊图形的脚本文件如下:
001 %OTHERS矢量方向图绘制示例 002 subplot(2,2,1) 003 [X,Y,Z] = peaks(-2:0.25:2); 004 [U,V] = gradient(Z, 0.25); 005 contour(X,Y,Z,10); 006 hold on 007 quiver(X,Y,U,V); 008 title('表面梯度 - (CONTOUR & QUIVER)') 009 subplot(2,2,2)
113
010 contourf(X,Y,Z,10); 011 title('填充等高线 - (CONTOURF)') 012 theta = 0:0.1:4*pi; 013 [x,y] = pol2cart(theta(1:5:end), theta(1:5:end)); 014 subplot(2,2,3) 015 compass(x,y) 016 title('放射线图- (COMPASS)') 017 subplot(2,2,4) 018 feather(x(1:19),y(1:19)) 019 title('线性放射线图 - (FEATHER)')
114
图6-35 特殊图形绘制示例
115
调色板(colormap) MATLAB为每一个图形窗口都创建了一个调色板(Colormap)。调色板其实就是一个简单的三列矩阵,矩阵的行数就是其定义的色彩数量,而矩阵的每一行三个元素代表着一种色彩,行元素取值范围在0.0~1.0之间,这三个元素分别对应一种RGB色彩。 MATLAB默认使用的调色板包含有64种色彩,在MATLAB命令行窗口中键入colormap指令可以获取默认使用的调色板矩阵。 若需要使用调色板矩阵,则需要使用image函数绘制数据,然后再使用不同的调色板。其中image函数在第五章中就已经用到了,该函数将MATLAB工作空间中的矩阵数据绘制在MATLAB的图形窗体上。第五章中绘制的数据都是导入的图片,若使用image函数绘制普通矩阵会是什么样的结果呢?
116
例子6-13 image函数绘制普通矩阵。 例子6-13使用的脚本文件为 001 %IMAGE_EXAMP使用image函数绘制普通矩阵 002 A = magic(4); 003 %使用默认的调色板 004 image(A); 005 %创建新的调色板 006 map = hsv(16); 007 %应用调色板 008 colormap(map); 009 %绘制调色板的内容 010 colorbar; 011 title('使用16色调色板');
117
图像 调色板 图6-36 image函数绘制普通矩阵
118
尽管例子6-13的代码非常短小,还是需要花费一点时间仔细研究一下的。
首先,脚本文件创建了一个具有16个元素的幻方矩阵,这个矩阵元素的数值从1~16不等。在使用image函数将矩阵转变为图像时使用了默认的调色板(有兴趣的读者可以查看一下例子6-13的中间图像结果)。 然后脚本文件从MATLAB自带的调色板中获取了一个子集,这个子集使用hsv函数,将系统提供的hsv调色板的前16个色彩数据取出,复制给新的调色板——map。接着colormap函数使用新创建的调色板,并将调色板的内容绘制在图像右侧,这时才得到例子6-13的最终结果。
119
提示: colorbar函数默认将调色板的色彩绘制成垂直的色条,也可以将其绘制为水平的色条,只需指定参数horiz即可。 MATLAB提供了部分默认的调色板,这些调色板分别代表了一种色调,用户可以将这些调色板使用在绘图之中。另外,在图形图像文件格式中,有一种是以索引色保存起来的文件,此类文件加载到MATLAB工作空间之后都会有一个调色板矩阵。而应用调色板和绘制色条的方法非常简单,只要在colormap函数中指定相应的调色板,然后直接调用colorbar函数即可。
120
例如,在MATLAB命令行窗口中键入如下指令可以将MATLAB的logo.bmp图片文件保存成为索引色位图图片。
>> img = importdata('logo.bmp') img = cdata: [192x256 uint8] colormap: [255x3 double] >> image(img.cdata); >> colormap(img.colormap) >> colorbar('horiz')
121
图6-37 显示索引色的图片
122
表6-2 MATLAB的标准调色板
123
在表6-2中总结的这些调色板都是相应的MATLAB函数,除了vga调色板外,每个调色板都可以指定不同的色彩个数。例如,创建一个具有256种色彩的增强色(Colorcube)调色板,命令行如下:
map = colorcube(256) 除了MATLAB系统提供的这十几种标准的调色板以外,MATLAB还允许用户自己定义调色板。用户自定义的调色板需要通过MATLAB提供的调色板编辑器定义。使用该调色板编辑器的方法很简单,在MATLAB命令行窗口中键入命令: >> colormapeditor 若此时已经存在一个打开的MATLAB图形窗体,则调色板编辑器加载当前使用的调色板,否则打开一个空白的图形窗体,然后显示系统默认使用的调色板,如图6-38所示。
124
图6-38 调色板编辑器
125
用户在编辑自己的调色板时,可以通过加载标准调色板,然后再修改其中的色块的方法来进行。修改色块的时候,只要双击需要修改的色块,系统就会弹出色彩选择对话框(如图6-39所示),供用户选择不同的色彩。若需要删除已有的色块,只要用鼠标选择准备删除的色块,然后按Delete键就可以完成操作。若需要添加色块,只要在色彩条的下方的空白处单击鼠标,就可以向已有的调色板中添加新的控制点色块。控制点色块可以任意地在色条上移动,从而得到最后需要的效果。
126
图6-39 色彩选择对话框
127
提示: 在MATLAB的帮助文档中有一个例子详细地解释了使用MATLAB调色板编辑器的方法,在本书中就不再赘述了,有兴趣的读者可以通过阅读该例子详细了解调色板编辑器的使用方法。 查找该例子的方法为:在MATLAB命令行窗口中键入doc colormapeditor,在函数的帮助中就包含有关例子的说明。
128
6.5 基本三维绘图 三维图形的表现能力要强于二维图形,在很多时候需要使用MATLAB绘制三维图形的能力。MATLAB提供了若干函数进行三维数据可视化,同时还有若干种方法进行三维图形对象属性的设置和控制。在本小节,将介绍MATLAB进行三维图形处理的基本方法。其实三维图形的绘制也是在二维平面中实现的,这其中涉及了计算机图形学等学科的基本知识,有兴趣的读者可以参阅有关的教科书。
129
绘制三维图形的基本过程要比绘制二维图形复杂一些,基本过程如下:
(1) 准备需要绘制在MATLAB图形窗体中的数据。 (2) 创建图形窗体,并且选择绘制数据的区域。 (3) 使用MATLAB的3D绘图函数绘制图形或者曲线。 (4) 设置调色板和投影算法。 (5) 增加光照,设置材质。 (6) 设置视点(viewpoint)。 (7) 设置绘图坐标轴的属性。 (8) 设置透视比。 (9) 为绘制的图形添加标题、轴标签或者标注文本等。 (10) 打印或者导出图形。
130
例子6-14 简单三维绘图。 例子6-14的脚本文件代码如下: 001 %PLOT_3D 简单三维绘图 002 % 准备数据 003 z = 0:0.1:40; 004 x = cos(z); 005 y = sin(z); 006 clf; 007 % 绘制曲线 008 plot3(x,y,z) 009 % 添加标注
131
010 grid on 011 title('Spiral Plot - using PLOT3') 012 xlabel('x') 013 ylabel('y') 014 zlabel('z')
132
图6-40 简单的三维绘图
133
例子6-14中使用了函数plot3,该函数类似plot函数,能够将X、Y、Z坐标绘制在三维的空间,它的基本语法如下:
plot3(xdata, ydata, zdata, 'clm', ) 在命令行中,clm的取值和plot函数的取值完全一致。 在例子6-14的代码中,使用zlabel函数向坐标轴添加标签,它的用法类似于xlabel和ylabel函数。 在例子6-14中,没有进行其他复杂的操作,比如设置光线、视点和三维实体的表面材质等特性。在例子6-15中完整地演示了绘制三维曲面的过程。
134
例子6-15 绘制复杂的三维曲面。 例子6-15使用的脚本文件如下: 001 %准备数据 002 Z = peaks(20); 003 %选择图形窗体 004 figure(1);clf 005 %调用3D绘图函数 006 h = surf(Z); 007 %设置调色板和投影算法 008 colormap hot;
135
009 shading interp; 010 set(h,'EdgeColor','k') 011 %增加光照 012 light('Position',[-2,2,20]) 013 lighting phong 014 %设置材质 015 material([0.4,0.6,0.5,30]) 016 set(h,'FaceColor',[ ],... 'BackFaceLighting','lit') 018 %设置视点
136
019 view([30,25]) 020 set(gca,'CameraViewAngleMode','Manual') 021 %设置轴属性 022 axis([ ]) 023 set(gca,'ZTickLabel','Negative||Positive') 024 %设置透视比 025 set(gca,'PlotBoxAspectRatio',[ ]) 026 %添加文本注释 027 xlabel('X Axis');ylabel('Y Axis');zlabel('Function Value'); 028 title('Peaks');
137
图6-41 代码运行的中间结果
138
图6-42 程序运行的最终结果
139
在例子6-15的代码中使用了很多三维图形属性设置的函数以及大量的图形对象属性,这些内容已经超出了本书的讨论范围,有兴趣的读者可以结合例子的代码阅读MATLAB的帮助文档或者函数的在线帮助。
为了便于绘制三维图形,MATLAB提供了一些函数用于特殊的三维曲面绘制,其中经常使用的函数有mesh函数和surf函数。 mesh函数用来绘制三维的线框图,它的输入参数一般为X、Y和Z三个坐标系的数据,同时该函数还有meshc和meshz函数两种变形,其中meshc函数用来绘制具有等高线性质的mesh曲面,meshz函数用于绘制mesh曲面的参考面,这三个函数的使用参见例子6-16。
140
例子6-16 mesh函数的应用。 例子6-16的脚本文件包含下列代码: 001 % MESH_EXAMP mesh函数举例 002 % 准备数据 003 [X,Y] = meshgrid(-3:.125:3); 004 Z = peaks(X,Y); 005 subplot(1,3,1); 006 meshc(X,Y,Z); 007 axis([ ]);title('Meshc'); 008 subplot(1,3,2); 009 meshz(X,Y,Z);
141
010 axis([-3 3 -3 3 -10 5]);title('MeshZ');
011 subplot(1,3,3); 012 mesh(X,Y,Z); 013 axis([ ]);title('Mesh'); 014 colormap gray 015 set(gcf,'Position', [ ]);
142
例子6-16的运行结果如图6-43所示。 图6-43 mesh函数使用示例
143
在例子6-16中,使用了meshgrid函数创建二维的网格数据。meshgrid函数可以用来创建三维曲线绘图的原始数据,它根据输入参数,创建等间距的网格数据。关于meshgrid函数的详细信息请参阅MATLAB的帮助文档或者函数的在线帮助。 通过例子6-16的运行结果能够明显地看出函数mesh、mehsc、meshz之间的区别。有关mesh函数的详细使用方法请参阅MATLAB的帮助文档。 surf函数和mesh函数不同,surf函数能够创建用色彩表示的曲面图,而不是线框图,而且该函数有一种变形,就是surfc。所以,若将例子6-16的代码进行适当的修改,则得到的结果如图6-44所示。
144
surf函数具体的使用请参阅MATLAB的帮助文档或者函数的在线帮助。其他的三维曲线、曲面绘制函数就不再赘述了。最后给出一个三维曲面的绘制示例,这里主要使用了waterfall函数、contour3函数和前面介绍过的plot3函数。若对例子6-17使用的函数有所疑问,请参阅MATLAB的帮助文档。
145
图6-44 surf函数使用示例
146
例子6-17 其他三维绘图函数示例。 例子6-17的脚本文件代码如下: 001 %SURF_3D 三维绘图函数示例 002 % 准备数据 003 x = ?3:0.3:3; y = x; 004 [X,Y]=meshgrid(x,y); 005 [theat,R] = cart2pol(X,Y); 006 Z = sinc(R); 007 % 等高线 008 subplot(2,2,1) 009 contourf(peaks(30), 10)
147
010 colorbar 011 grid on 012 title('Peaks Function - (CONTOURF & COLORBAR)') 013 % plot3函数绘制矩阵数据 014 subplot(2,2,2) 015 plot3(X,Y,Z) 016 grid on 017 axis([ ]) 018 title('Sinc Function - (PLOT3)') 019 % waterfall函数,效果类似surfz函数 020 subplot(2,2,3)
148
021 waterfall(membrane(1));
022 title('L-shaped Membrane - (WATERFALL)') 023 %三维等高线 024 subplot(2,2,4) 025 contour3(peaks(30), 25); 026 title('Peaks Function - (CONTOUR3)') 027 colormap hsv
149
图6-45 三维绘图函数的应用示例
150
6.6 保存和输出图形 保存和打开图形文件 MATLAB支持将图形文件保存成为二进制格式的文件。为此,MATLAB提供了一种类似于MAT格式的文件用来保存MATLAB的图形文件,这种文件的扩展名为*.fig。这种二进制的图形格式文件只能够在MATLAB中使用。 若需要将文件保存成为fig格式的图形文件,则在图形窗体中选择“File”菜单下的“Save”命令,或者直接单击工具栏上的保存按钮,在弹出的对话框中选择保存类型为 .fig,如图6-46所示。
151
在对话框中给定文件名称,然后单击“保存”按钮就可以保存文件了。
打开文件的过程和保存文件的过程类似,都可以通过菜单命令或者工具栏的按钮完成操作。 不过,MATLAB独具特色的就是为保存的图形文件提供了相应的命令,这个命令就是saveas,该命令的一般语法结构如下: saveas(h, 'filename.ext'); saveas(h, 'filneame','format');
152
图6-46 保存图形文件的对话框
153
其中,h为图形的句柄,例如可以直接使用gcf指令获取当前的图形窗口的句柄;filename为保存的文件名,而saveas命令根据ext的不同将文件存成为不同的格式。在第二种命令行格式中,format直接说明文件的保存格式,它可以是图形文件的扩展名,或者是m,或者mfig,在取m或者mfig的时候,文件将被保存成为一个可调用的M文件和相应的图形数据文件。 打开图形文件就只要用open命令就可以了,open函数会根据文件的扩展名不同而调用相应的辅助函数文件。例如在打开 .fig图形文件时,调用open命令,具体过程请参阅例子6-18。
154
例子6-18 在命令行中保存打开图形文件。 在MATLAB命令行窗口中,键入下面的指令: >> surf(peaks(30)) >> % 将图形文件保存为M文件和fig文件 >> saveas(gcf,'peakfile','M') >> % 调用M文件重新显示窗体 >> peakfile >> % 使用open指令打开文件 >> open('peakfile.fig')
155
在上面的短短几行代码中,代码将图形文件保存成为了一个M文件和一个fig文件,其中M文件的主要内容是:
001 function h = peakfile 002 [path, name] = fileparts(which(mfilename)); 003 figname = fullfile(path, [name '.fig']); 004 if (exist(figname,'file')), open(figname), else open([name '.fig']), end 005 if nargout > 0, h = gcf; end 在文件中,不可缺少的就是大量的注释信息,而M文件的代码主要保证了可靠地打开保存的图形文件。最后的open命令能够完成同样的功能。
156
导出文件 尽管保存 .fig文件非常方便,但是 .fig文件却只能够在MATLAB中使用,所以MATLAB的图形窗口还可以将图形文件保存成其他的特殊图形格式文件。在表6-3中列举了能够直接在图形窗体中导出的图形文件类型。
157
表6-3 MATLAB支持的图形文件格式
158
若需要将图形文件保存成表6-3列举的各种类型文件,需要执行图形窗体“File”菜单下的“Export”命令,然后在对话框中选择需要导出的图形文件格式,最后给出相应的文件名,单击“保存”按钮后完成操作,对话框如图6-47所示。
159
图6-47 导出文件对话框
160
在前面小节介绍的saveas指令中,也可以使用这些扩展名来保存图形文件。例如将图形文件保存成为tiff格式的文件,命令行为
saveas(h,filename, 'tif'); MATLAB提供了另外一个功能强大的命令来保存图形文件,这个命令就是print命令。 从直观上看,print命令的作用是将图形文件通过打印机输出,它也支持将图形文件保存成其他格式的图形文件或者数据文件,这些图形文件不仅仅是那些在表6-3中列出的图形文件,而且还有更多的格式可以被支持,例如PostScript格式的文件等。
161
MATLAB还提供了一个名为printopt的M文件,该文件主要可以由系统管理员编辑,以指明缺省的打印机类型和打印目标,当调用它时,返回缺省值的打印命令和设备选项,例如在Windows系统下执行该命令: >> [pcmd,dev] = printopt pcmd = COPY /B $filename$ $portname$ dev = -dwin
162
print命令的基本使用方法如下: print -device -options filename 在命令行中,device 和 options的选取有很多选项,而device可以是某种MATLAB支持的打印驱动,也可以是某种图形文件格式。由于受篇幅的限制这里就不一一解释说明了,请读者参阅MATLAB的帮助文档:doc print。 若将图形文件输出到打印机,则使用以下命令行: >> print 这时print命令就可以直接将图形文件输出到当前系统默认的打印机。
163
将图形输出成为PostScript文件,可以指定相应的设备,例如:
>> print -dps filename 可以将图形文件保存为黑白的PS文件,而命令行: >> print -dpsc filename 可以将图形文件保存为彩色的PS文件。
164
拷贝图形文件 在Windows操作系统中,可以将图形窗体中的内容拷贝到剪贴板上,然后可以将剪贴板上的内容拷贝到任何一个Windows应用程序中。拷贝图形时,不是简简单单地按下快捷键Ctrl+C就可以了,而是需要通过图形窗体“Edit”菜单下的“Copy Figure”命令来完成,如图6-48所示。
165
图6-48 拷贝图形的菜单命令
166
这时拷贝下来的图形粘贴出来的效果类似前面章节图6-24的效果。可以通过选择“MATLAB”菜单下的“Reference”命令,在弹出的对话框中对控制拷贝图形效果的选项参数进行设置,如图6-49所示。
167
图6-49 设置拷贝图形的模板
168
MATLAB提供了两种Windows应用程序的拷贝模板——Word和PowerPoint,用户可以在如图6-49所示的对话框中设置相应的模板选项,而更加精细的设置需要在拷贝选项对话框中进行。
在如图6-50所示的对话框中可以设置精细的拷贝选项,比如剪贴板的选项以及背景图的设置等。当拷贝图形效果不甚理想的时候,可以通过修改这些设置来达到满意的效果。
169
图6-50 拷贝选项对话框
170
6.7 数据插值和曲线拟合 插值运算 一般地,从各种试验得来的数据总是有一定的数量,而利用插值技术能够从有限的数据中获取系统整体的状态,因此,数据插值在各行各业,特别是信号处理领域内有着广泛的应用。MATLAB软件作为数据处理的优秀软件之一,自然提供了常用的各种数据插值计算的函数。在本小节,主要介绍由MATLAB基本模块提供的插值计算函数。
171
表6-4 插值计算函数
172
在表6-4的函数中较常用的就是进行基本插值的interp系列函数,其中interp1和interp1q函数比较起来,后者在处理X为单调递增的向量,Y为列向量或者行数同X向量长度的矩阵进行插值计算的时候,速度较快,而且仅能进行线性插值。 interp1函数一般的用法为 yi = interp1(x, y, xi, method) 其中: * x和y为原始数据。 * xi为需要计算的插值点。
173
* method可以为插值计算指定相应的算法,为字符串类型,其取值可以为nearest、linear、spline、cubic、pchip、v5cubic。
在interp系列函数中method参数使用的几种不同的取值分别对应了不同的插值计算方法,例如linear为线性插值算法,它也是系统默认的插值算法,而spline为三次杨条插值算法。有关插值算法请参阅相应的数值分析教科书,对于更高次的插值算法函数,请参阅MATLAB的帮助文档。
174
若进行插值运算时,xi的取值超过了x的范围,则需要进行外插运算,这个时候需要在使用函数的时候指定参数extrap,即函数的使用方法为
yi = interp1(x, y, xi, method, 'extrap');
175
例子6-19 一维插值函数示例。 例子6-19使用的脚本文件如下: 001 %INTERP_EX1 一维插值计算示例 002 % 准备数据 003 x = 0:10; 004 y = cos(x); 005 % 插值点 006 xi = 0:0.2:10; 007 % 进行插值运算 008 yin = interp1(x,y,xi,'nearest'); 009 yic = interp1(x,y,xi,'cubic'); 010 % 绘制结果 011 plot(x,y,'o',xi,yin,'*',xi,yic) 012 legend('origin','nearest','cubic') 013 title('一维插值计算示例')
176
运行脚本文件得到的结果如图6-51所示。在例子6-19的代码中,使用了两种一维插值算法,分别为nearest和cubic,由于nearest算法仅计算插值点左近的数值,所以从结果上看插值得到的结果很不理想,而三次插值计算得到的结果相对要理想得多。 不过从计算时间和内存等系统资源的损耗上考虑,nearest是最快的而又最节省资源的一种算法,而三次插值或者样条插值运算则需要消耗较多的系统资源,所以请用户根据需要选择合适的插值算法。
177
二维插值运算函数的使用方法类似一维插值运算函数的使用方法,同样也可以在使用函数的同时指定相应的算法:nearest、linear、cubic和spline等。与一维插值不同的是,这里使用的插值算法都需要进行双次运算,所以也可以在算法选择时使用bilinear或者bicubic关键字指定相应的算法。在例子6-20中,对这几种插值算法进行了比较。
178
图6-51 一维插值计算示例
179
例子6-20 二维插值运算算法比较。 001 function compare_interp( ) 002 %COMPARE_INTERP 不同插值运算的比较 003 004 % 原始数据 005 [x,y] = meshgrid(?3:1:3); 006 z = peaks(x,y); 007 figure(1); clf 008 surfc(x,y,z); 009 title('原始数据') 010 % 进行插值运算
180
011 [xi, yi] = meshgrid(?3:0.25:3);
012 zi1 = interp2(x,y,z,xi,yi,'nearest'); 013 zi2 = interp2(x,y,z,xi,yi,'linear'); 014 zi3 = interp2(x,y,z,xi,yi,'cubic'); 015 zi4 = interp2(x,y,z,xi,yi,'spline'); 016 % 通过可视化结果比较 017 figure(2) 018 subplot(2,2,1);surf(xi,yi,zi1); 019 title('二维插值 - ''nearest''') 020 subplot(2,2,2);surf(xi,yi,zi2); 021 title('二维插值 - ''linear''') 022 subplot(2,2,3);surf(xi,yi,zi3)
181
023 title('二维插值 - ''cubic''') 024 subplot(2,2,4);surf(xi,yi,zi4) 025 title('二维插值 - ''spline''') 026 % 可视化结果 027 figure(3) 028 subplot(2,2,1);contour(xi,yi,zi1) 029 title('二维插值 - ''nearest''') 030 subplot(2,2,2);contour(xi,yi,zi2) 031 title('二维插值 - ''linear''') 032 subplot(2,2,3);contour(xi,yi,zi3) 033 title('二维插值 - ''cubic''') 034 subplot(2,2,4);contour(xi,yi,zi4) 035 title('二维插值 - ''spline'''')
182
图6-52 例6-20的结果图 (a) 原始数据的曲面图
183
图6-52 例6-20的结果图 (b) 插值数据结果图——surf
184
图6-52 例6-20的结果图 (c) 插值运算结果图——contour
185
若在执行例子6-20的代码时,打开性能分析器,则可以看到012~014行代码占用的计算时间,下面为分析文件的片段:
...... x zi1 = interp2(x,y,z,xi,yi,'nearest'); x zi2 = interp2(x,y,z,xi,yi,'linear'); x zi3 = interp2(x,y,z,xi,yi,'cubic'); x zi4 = interp2(x,y,z,xi,yi,'spline');
186
通过例子6-20的运算结果可以看出,不同的插值算法在运算结果和运算消耗时间上的差别。用户同样需要根据自己的需要选择不同的算法。
有关数据插值的应用还有很多内容,受篇幅的限制这里就不再一一详细介绍。有兴趣的读者可以通过学习有关数值分析的知识,同时了解和掌握不同的MATLAB数据插值函数。
187
曲线拟合 曲线拟合的任务和数据插值的任务不同,曲线拟合需要从一些离散的数据中推导出两者之间的数学解析关系,而数据插值是通过原始数据计算一些新的离散数据点。曲线拟合的结果一般为一个或者多个数学解析关系,利用这些解析关系能够对数据进行一定的推断,准确的曲线拟合结果可以用来进一步评估、验证实测的数据。在本小节将介绍利用MATLAB的基本模块进行曲线拟合的函数和方法,而MATLAB高级的曲线拟合应用请参阅MATLAB 和Curve Fitting工具箱的帮助文档。 利用MATLAB进行曲线拟合主要有两种方法:回归法拟合和多项式拟合,本小节通过一些具体的示例来说明这两种不同的曲线拟合方法。
188
例子6-21 回归法曲线拟合。 回归法主要使用MATLAB的左除运算来寻找曲线拟合解析函数的系数。例如有这样一组数据: >> t = [ ]'; >> y = [ ]'; 将这组数据绘制出来: >> plot(t,y,'r*') >> grid on 得到如图6-53所示的图形结果。
189
图6-53 进行拟合计算的原始数据
190
通过图6-53的分布情况,可以猜测该数据由如下的表达式得出:
进行曲线拟合的任务就是分别求得表达式中的三个系数,这样就可以得到相应的等式关系: Y=AT 若需要求得A则只要计算除法: A=Y/T
191
于是,在MATLAB中键入下面的指令,就可以得到计算的结果:
>> X = [ones(size(t)) t t.^2] X = >> A = X\y A = 0.5318 0.9191
192
这样得到的多项式应该为 y= t t2 为了验证结果,可以进一步进行计算: >> T = (0:0.1:2.5)'; >> Y = [ones(size(T)) T T.^2]*A; >> plot(T,Y,'-',t,y,'o'), grid on >> legend('Fitting','Origin') 这时得到的图形结果如图6-54所示。
193
图6-54 拟合结果与原始数据的比较
194
除了多项式以外,还可以猜测原始数据的多项式是由指数函数组成的:
于是,为了求得系数,可以在MATLAB的命令行中键入下面的指令: >> X = [ones(size(t)) exp(-t) t.*exp(-t)] X =
195
左除: >> A = X\y A = 1.3974 0.4097 这样得到的多项式应该为
196
为了验证这次得到的结果,可以进一步计算:
>> T = (0:0.1:2.5)'; >> Y = [ones(size(T)) exp(-T) T.*exp(-T)]*A; >> plot(T,Y,'-',t,y,'o'), grid on >> legend('Fitting', 'Origin') 这时得到的曲线图形如图6-55所示。
197
图6-55 曲线拟合结果和原始数据比较
198
可以看出,在两次的曲线拟合结果中,利用指数函数拟合的结果比较好。
另外一种曲线拟合的方法是多项式拟合。在MATLAB中,进行多项式拟合主要使用两个函数:polyfit和polyval。 polyfit函数主要用来进行拟合计算,它的基本语法为 p = polyfit(x,y,n) 其中,x和y为参与曲线拟合计算的原始数据,n为进行拟合计算的多项式次数,函数的返回值是多项式的系数,也就是说,函数的运算结果为多项式的系数向量。
199
polyval函数主要用来计算多项式的数值,它的基本语法为
y = polyval(p,x) 其中,p为多项式的系数,而x是变量的数值,得到的结果就是函数的数值向量。
200
例子6-22 polyfit函数和polyval函数的应用示例。
下面是例子6-22的脚本文件: 001 %CURVE_FIT 多项式拟合计算示例 002 % 准备原始数据 003 x = 0:.1:10; 004 y = sin(x)+cos(2*x); 005 % 5次多项式拟合 006 k5 = polyfit(x,y,5); 007 y5 = polyval(k5, x); 008 % 11次多项式拟合 009 k11 = polyfit(x,y,11); 010 y11 = polyval(k11, x);
201
011 % 绘制数据曲线 012 plot(x, y, 'g', x, y5, 'r', x, y11, 'b') 013 % 标注 014 title('Curve Fitting', 'Fontsize',14) 015 legend('Original Curve', '5th order', '11th order',4 ) 016 set(findobj('Type', 'line'), 'LineWidth', 2)
202
运行例子6-22的代码: >> curve_fit Warning: Polynomial is badly conditioned. Remove repeated data points or try centering and scaling as described in HELP POLYFIT. (Type "warning off MATLAB:polyfit:RepeatedPointsOrRescale" to suppress this warning.) > In E:\MATLAB6p5\toolbox\matlab\polyfun\polyfit.m at line 75 In D:\Temp\Ch6\curve_fit.m at line 9
203
出现上述警告信息的原因是使用了过高的数据拟合阶数。由于polyfit函数是通过左除算法获取多项式系数的,如果此时矩阵接近奇异(不可逆),但又需要对该矩阵进行求逆计算时,则会出现上述的警告信息。
例子6-22运行的图形结果如图6-56所示。
204
图6-56 曲线拟合的图形结果
205
基本拟合工具 为了便于进行曲线拟合计算,MATLAB提供了基本的曲线拟合工具界面,利用这个图形界面,可以方便地实现常用的曲线拟合工作,利用该界面可以完成下列工作: * 使用三次样条曲线(cubic spline)或最高10阶的多项式拟合数据。 * 对一组给定的数据同时绘制多条拟合曲线。 * 绘制拟合残差曲线。 * 查看拟合的数值结果。 * 对拟合曲线求值(内插或外推)。 * 用拟合数值结果和残差的范数标注图形。 * 把拟合的结果保存到 MATLAB工作区。
206
例子6-23 使用基本曲线拟合工具。 进行曲线拟合工作的第一步是加载原始数据,在本例子中,使用的数据来自于MATLAB自带的Demo,关于该MATLAB自带例子的信息请参阅在线帮助:help census。 在MATLAB命令行窗口中键入下面的指令: >> load census >> plot(cdate,pop,'ro'); 绘制出原始数据后,执行图形窗体“Tools”菜单下的“Basic Fitting”命令,这时将弹出基本曲线拟合工具的图形用户界面,如图6-57所示。
207
在弹出的对话框中,首先选择需要进行曲线拟合的数据,在“Select data”的下拉列表框中,选择“data1”,即当前进行曲线拟合运算的数据。若坐标轴上有多条数据时,则可以选择不同的曲线拟合原始数据。
208
图6-57 基本曲线拟合工具界面
209
然后选择一个合适的拟合算法。在基本曲线拟合算法列表框中,选择“cubic”复选框,这时将使用三次多项式进行曲线拟合计算。选择“Show equations”复选框,则系统将曲线拟合的多项式绘制在图形中。另外,还可以通过选择不同的复选框,在图形窗体中输出曲线拟合的残差,以及残差的范数等,这时的曲线拟合工具界面如图6-58所示。
210
图6-58 设置曲线拟合的属性
211
在选择曲线拟合算法的时候,系统有时候会给出如图6-59所示的对话框提示。
该信息在前面利用函数进行多项式计算的时候已经有所提示,为了解决该问题,需要选择“Center and Scale X data”复选框。在选择不同的曲线拟合属性的同时,系统将不断地将曲线拟合结果输出在图形窗体中,在完成了上述操作步骤之后,曲线图形窗体的结果如图6-60所示。
212
图6-59 基本拟合计算的提示信息
213
图6-60 曲线拟合的结果绘制在图形窗体中
214
此时图形窗体中的注释是由系统自动添加的,可以使用图形编辑器修改其中的内容。单击基本曲线拟合工具的按钮,可以得到基本曲线拟合工具的扩展,在这部分扩展的工具界面中,可以查看曲线拟合计算的结果,包括多项式的系数和范数等,如图6-61所示。
215
图6-61 基本曲线拟合工具的界面扩展
216
在扩展界面中,单击“Save to workspace”按钮可以将曲线拟合计算得到的结果保存到工作空间中,如图6-62所示。
图6-62 将曲线拟合的结果保存到工作空间
217
这时保存的结果为一个结构,按下“OK”按钮之后在MATLAB命令行窗口中输入下列指令进行查看:
Basic Fitting GUI created variables in the current workspace. >> whos Name Size Bytes Class cdate x double array fit x struct array normresid x double array pop x double array Grand total is 68 elements using 662 bytes
218
在工作空间中的变量包含了曲线拟合的多项式系数结果。利用该结果可以通过polyval函数进一步计算多项式的数值。
>> fit1 fit1 = type: 'polynomial degree 3' coeff: [ ] 在工作空间中的变量包含了曲线拟合的多项式系数结果。利用该结果可以通过polyval函数进一步计算多项式的数值。 若再次单击基本曲线拟合界面上的按钮,则能够得到再次扩展的工具界面,在该界面中可以计算一下当前拟合多项式的数值,如图6-63所示。
219
图6-63 进一步扩展基本曲线拟合界面
220
在本例子中,进一步计算了2000年至2040年之间的人口数量的变化,间隔为10年。通过选择“Plot evaluated results”复选框,可以将这些拟合计算的结果也绘制在图形界面中,如图6-64所示。
221
图6-64 曲线拟合运算的结果
222
如果选择“Save to workspace”按钮,还可以将结果保存在工作空间中。
通过例子6-23的学习,读者应该已经基本掌握了基本曲线拟合工具的使用方法。更高级的曲线拟合工作可以使用MATLAB的曲线拟合工具箱来完成。不过有关曲线拟合工具箱方面的知识已经超出了本书的讨论范围,有兴趣的读者请参阅MATLAB的帮助文档。
223
6.8 本 章 小 节 在本章详细介绍了MATLAB的基本图形和数据可视化的能力。MATLAB的图形和数据可视化是其强大功能的一个重要表现,这其中包括了灵活的二维和三维数据可视化、各种图形标注和特殊图形的绘制能力,另外MATLAB还提供了丰富的导入、导出数据图形的能力。MATLAB不仅能够将图形绘制出来,而且还具有完成一定的数据分析的能力,在本章介绍了数据插值和曲线拟合的方法。通过本章的学习,读者应该能够掌握基本的数据可视化和绘图函数的使用,同时能够完成简要的数据统计分析的工作。除了利用MATLAB本身的数据分析功能以外,还可以利用Curve Fitting 工具箱完成复杂的曲线拟合工作,使用Statistics工具箱进行高级数据统计工作。数据可视化和分析是科学计算、信号处理、控制系统应用等领域的重要内容,掌握本章的内容可以为这些领域内的高级应用打下坚实的基础。
Similar presentations