5.2 二维图形绘制(3)
5.2.6 图形叠绘
plot指令可以在同一次调用中画出多条曲线,此功能已经在5.2.1节中进行了介绍。在实际应用中,经常遇到在已经存在的图形上绘制新的曲线,并保留原来的曲线,MATLAB中的以下指令可以完成这项功能。
● hold on语句:语句功能为使当前轴及图形保留下来而不被刷新,并接收即将绘制的新的曲线。
● hold off语句:语句功能为不保留当前轴及图形,绘制新的曲线后,原图即被刷新。
● hold语句:语句功能为hold on语句与hold off语句的切换。
例5-15:图形叠绘示例。
创建M文件并命名为figurehold.m(同时存为ex5_15.m),利用M文件编辑器在M文件中输入:
clear all figure x = 0 : 0.01 * pi : pi * 4; y = 0 : pi : pi * 8; subplot(1,2,1) plot(x, sin(x), 'r:', 'LineWidth', 3);hold on; plot(x, 2 * sin(x / 2), 'b', 'LineWidth', 3);hold on; plot(y, sin(y), 'g^', 'MarkerSize', 10, 'LineWidth', 3);hold on; plot(y, 2 * sin(y / 2), 'mo', 'MarkerSize', 10, 'LineWidth', 3);hold on; xlim([0 pi *4]) subplot(1,2,2) plot(x, sin(x), 'r:', 'LineWidth', 3); plot(x, 2 * sin(x / 2), 'b', 'LineWidth', 3);hold on; plot(y, sin(y), 'g^', 'MarkerSize', 10, 'LineWidth', 3); plot(y, 2 * sin(y / 2), 'mo', 'MarkerSize', 10, 'LineWidth', 3);hold on; xlim([0 pi * 4])
运行M文件,结果如图5-17所示。
图5-17 figurehold.m运行结果
5.2.7 子图绘制
MATLAB允许用户在同一个图形窗中同时绘制多幅相互独立的子图,这需要应用到subplot指令,其句法格式如下。
● subplot(m,n,k):将(m×n)幅子图中的第k幅图作为当前曲线的绘制图。
● subplot('position',[left bottom width height]):在指定位置上生成子图,并作为当前曲线的绘制图。
subplot指令说明:
(1)subplot(m,n,k)指令生成的图形窗中将会有(m×n)幅子图,k是子图的编号,编号的顺序为:左上为第一幅子图,然后向右后向下依次排号。该指令产生的子图分割与占位完全按照默认值自动进行。
(2)subplot('position',[left bottom width height])指令所产生的子图的位置由用户指定,指定位置的4个元素采用归一化的标称单位,即认为图形窗的宽、高的取值范围均为[0,1],左下角的坐标为(0,0)。
(3)指令所产生的子图彼此之间相互独立,所有的绘图指令都可以在任一子图中运用,而对其他的子图不起作用。
(4)在使用subplot指令之后,如果再想绘制充满整个图形窗的图形,则应当先使用clf指令对图形窗进行清空。
例5-16:子图绘制示例。
创建M文件并命名为figuresub.m(同时存为ex5_16.m),利用M文件编辑器在M文件中输入:
clear all figure x = 0 : 0.01 * pi : pi * 16; j = sqrt(-1); subplot(2,2,1);plot(abs(sin(x)) .* (cos(x) + j * sin(x)), 'LineWidth', 3); xlim([-1 1]);ylim([-1 1]); subplot(2,2,2);plot(abs(sin(x / 2)) .* (cos(x) + j * sin(x)), 'LineWidth', 3); xlim([-1 1]);ylim([-1 1]); subplot(2,2,3);plot(abs(sin(x / 3)) .* (cos(x) + j * sin(x)), 'LineWidth', 3); xlim([-1 1]);ylim([-1 1]); subplot(2,2,4);plot(abs(sin(x / 4)) .* (cos(x) + j * sin(x)), 'LineWidth', 3); xlim([-1 1]);ylim([-1 1]);
运行M文件,结果如图5-18所示。
图5-18 figuresub.m运行结果
5.2.8 交互式绘图
MATLAB中还设置了相应的鼠标操作的图形操作指令,分别是ginput、gtext和zoom指令。首先对这3个指令进行一般性的说明。
(1)除了ginput指令只能应用于二维图形,其余两个指令对二维和三维图形均适用。
(2)ginput指令与zoom指令配合使用,可以从图形中获得较为准确的数据。
(3)在逻辑顺序并不十分清晰的情况下,并不提倡这几个指令同时使用。
1.ginput指令
其调用格式如下。
● [x,y]=ginput(n):其功能为用鼠标从二维图形中获得n个点的数据坐标(x,y)。
使用ginput指令时需要注意的是,指令中的n应当赋值为正整数,指令中的x和y用来存放所取点的坐标。该指令运行之后,会将当前图形从后台调度到前台。同时,鼠标光标变为十字形。用户可以移动鼠标,将其定位于待取点的位置处,单击则可获得该点的数据值,然后通过相同的方式取得之后的n-1组数据值。当n组数据全部取得之后,图形窗便退回后台,回到ginput指令执行前的环境中。
2.gtext指令
其调用格式如下。
● gtext(arg):其功能为用鼠标把字符串或字符串元胞数组放置到图形中作为文字说明。
使用gtext指令时需要注意的是,运行该指令后,会将当前的图像从后台调度到前台。同时,鼠标光标变为十字形。用户可以移动鼠标,将其定位于待放置的位置处,右击,字符串将被放在紧靠十字中心点的“第一象限”位置上。
如果输入的arg是单个字符串,单击则可以一次性将所有字符以单行的形式放置在图形之中;如果arg中包含多行字符串,则每次单击可将其中的一行字符串放置在图形之中,直到将所有的字符串全部放置在图形之中后,操作才全部完成。
3.zoom指令
zoom指令的具体应用句法有如下几种格式,如表5-13所示。
表5-13 zoom指令格式
指令格式 |
说明 |
zoom xon |
规定当前图形的x轴可以进行缩放 |
zoom yon |
规定当前图形的y轴可以进行缩放 |
zoom on |
规定当前图形可以进行缩放 |
zoom off |
规定当前图形不可进行缩放 |
zoom |
当前图形是否可以进行缩放状态的切换 |
zoom out |
使图形返回初始状态 |
zoom(factor) |
设置缩放变焦因子,默认值为2 |
使用zoom指令时需要注意的是,变焦操作方式与标准的Windows缩放相同,在可变焦的当前图形上,可直接单击进行图形的放大,也可以长按鼠标左键括住需要放大的区域,放开鼠标左键之后,指定的区域则会被放大,右击则可进行图形的缩小。
默认的变焦因子是2,即单击时图形被放大一倍,右击时图形被缩小一半。
5.2.9 双坐标轴绘制
在实际应用中,常常需要把同一自变量的两个不同量纲、不同量级的函数量的变化同时绘制在同一个图形窗中。例如,在同一张图中同时展示空间一点上的电磁波的幅度和相位随时间的变化;不同时间内的降雨量和温湿度的变化;放大器的输入/输出电流的变化曲线等。MATLAB中的plotyy指令可以实现上述功能,其调用格式如下。
● plotyy(X1,Y1,X2,Y2):以左、右不同的纵轴分别绘制X1-Y1和X2-Y2两条曲线。
● plotyy(X1,Y1,X2,Y2,Fun):以左、右不同的纵轴以Fun指定的形式分别绘制X1-Y1和X2-Y2两条曲线。
● plotyy(X1,Y1,X2,Y2,Fun1,Fun2):以左、右不同的纵轴分别以Fun1、Fun2指定的形式绘制X1-Y1和X2-Y2两条曲线。
使用plotyy指令时需要注意的是,左侧的纵轴用来描述X1-Y1曲线,右侧的纵轴用来描述X2-Y2曲线。轴的范围与刻度值都是自动生成的,在进行人工设置时,使用的绘图指令与一般的绘图指令相同。
例5-17:双坐标轴绘制示例。
创建M文件并命名为doubleaxis.m(同时存为ex5_17.m),利用M文件编辑器在M文件中输入:
clear all figure ang1 = 0 : 0.01 * pi : 2 * pi; amp1 = sin(0 : 0.01 * pi : 2 * pi); z = amp1 .* (cos(ang1) + sqrt(-1) * sin(ang1)); [AX, H1, H2] = plotyy(0 : 200, abs(z), 0 : 200, angle(z) * 180 /pi); set(get(AX(1), 'Ylabel'), 'String', 'amplitude') set(get(AX(2), 'Ylabel'), 'String', 'phase') set(H1, 'LineWidth', 3) set(H2, 'LineStyle', ':', 'LineWidth', 3)
运行M文件,结果如图5-19所示。
图5-19 doubleaxis.m运行结果
5.2.10 fplot绘图指令
之前应用到的plot指令,均是将用户指定的或计算得到的数据转换为图形。而在实际应用中,函数随着自变量的变化趋势是未知的,此时在plot指令下,如果自变量的离散间隔不合理,则无法反映函数的变化趋势。
fplot指令可以很好地解决以上问题,该指令通过MATLAB平台内部设置的自适应算法来动态决定自变量的离散间隔,当函数值变化缓慢时,离散间隔取大一些;当函数值变化剧烈时,离散间隔取小一些。fplot指令的调用格式如下。
● fplot(fun,limits):在limits定义的自变量的取值范围[xmin,xmax]内,或者在自变量与因变量的取值范围[xmin,xmax;ymin,ymax]内,绘制fun函数。
● fplot(fun,limits,LineSpec):在limits定义的取值范围内,在LineSpec所规定的线型、颜色、标记等属性下,绘制fun函数。
● fplot(fun,limits,tol):在limits定义的取值范围内,在tol所规定的相对误差允许范围内,绘制fun函数。
● fplot(fun,limits,tol,LineSpec):在limits定义的取值范围内,在LineSpec所规定的线型、颜色、标记等属性下,在tol所规定的相对误差允许范围内,绘制fun函数。
● fplot(fun,limits,n):在limits定义的取值范围内绘制fun函数,至少绘制n+1个点。
使用fplot指令时需要注意的是,tol为相对误差允许范围,其默认值为2e-3;n的默认值为1,即fplot指令至少绘制两个点,对n进行设置后,最大的步长限制为(xmax-xmin)/n。
例5-18:利用fplot指令绘图示例。
创建M文件并命名为sinx.m(同时存为ex5_18.m),利用M文件编辑器在M文件中输入:
clear all fplot(@sin, [-2 * pi 2 * pi]) grid on title('sinx from -2\pi to 2\pi') xlabel('x'); ylabel('y');
运行M文件,结果如图5-20所示。
图5-20 sinx.m运行结果
5.2.11 ezplot绘图指令
ezplot指令用于绘制函数在某一自变量区域内的图形。与fplot指令相同的是,ezplot指令中也需要对自变量的范围进行规定,其调用格式如下:
ezplot(f)
该语句的功能为:按MATLAB默认方式(自变量范围为-2π < x < 2π)绘制函数。
ezplot(f, [min, max])
该语句的功能为:设置x方向的变量范围为[min,max],y方向按MATLAB默认方式绘制函数。
ezplot(f, [xmin, xmax, ymin, ymax])
该语句的功能为:x方向的变量范围为[xmin,xmax],y方向的变量范围为[ymin,ymax],绘制函数。
ezplot(x, y)
该语句的功能为:按MATLAB默认方式(自变量范围为-2π < x < 2π)绘制函数x、y。
ezplot(x, y, [min, max])
该语句的功能为:按自变量范围为[min,max]绘制函数x、y。
例5-19:利用ezplot指令绘图示例。
创建M文件并命名为ellipse.m(同时存为ex5_19.m),利用M文件编辑器在M文件中输入:
clear all ezplot('sin(x)^2 + 4*cos(y)^2 = 4', [-5 5 -1 1]); axis square
运行M文件,结果如图5-21所示。
图5-21 ellipse.m运行结果