MATLAB程序设计与应用
5. 第5章 MATLAB绘图
强大的绘图功能是MATLAB的特点之一。MATLAB提供了一系列绘图函数,用户不需要过多考虑绘图细节,只需给出一些基本参数就能得到所而图形,赵一尖图双你问)图BA筋除此之外,MATLAB 还提供了直接对图形对象句柄进行操作的低层绘图探作。简云云图探作FN单明了、方便高效,是用户最常使用的绘图方法,而低层绘图操作控制和表现图形的能力更强,为用户更加自主地绘制图形创造了条件。事实上,MATLAB 的高层绘图函数都是利用低层绘图函数而建立起来的。
5.1 二维图形
二维图形是将平面坐标上的数据点连接起来的平面图形。可以采用不同的坐标系,除直角坐标系外,还可以采用对数坐标、极坐标。数据点可以用向量或矩阵形式给出,类型可以是实型或复型。二维曲形的绘制无疑是其他绘图操作的基础。
5.1.1 绘制二维曲线的基本函数
在MATLAB中,基本的绘图函数是plot函数,利用它可以绘制出不同的二维曲线。
-
plot函数的基本用法
plot 函数用于绘制xy平面上的线性坐标曲线图,因此需提供一组x坐标及其各点对应的y坐标,这样就可以绘制分别以x和y为横、纵坐标的二维曲线。plot函数的基本调用格式如下:
plot(x , y)
示例
>> x = 0 : pi / 100 : 2 * pi; >> y = 2 * exp(- 0.5 * x) .* sin(2 * pi * x); >> plot(x , y)
注意:求y时,指数函数和正弦函数之间要用点乘运算,而因2为标量,
所以2与指数函数之间可以用乘法运算。这样,向量x和向量y所包含的元素个数相等,y(i)是x(i)点的函数值。示例——绘制曲线
>> t = -pi : pi / 100 : pi; >> x = t .* cos(3 * t); >> y = t .* sin(t) .* sin(t); >> plot(x , y);
实际情况的变化:
-
当x是向量,y是矩阵时,x的长度与矩阵y的行数或列数必须相等。如果x的长度等于y的行数,则以x和y的每列为横、纵坐标绘制曲线,曲线的条数等于y的列数。如果x的长度等于y的列数,则以x和y的每行为横、纵坐标绘制曲线,曲线的条数等于y的行数。如果y是方阵,x的长度和矩阵y的行数或列数都相等,则以x和y的每列为横、纵坐标绘制曲线。
>> x = linspace(0 , 2 * pi , 100); >> y = [sin(x) ; cos(x)]; >> plot(x , y)
-
当x、y是同型矩阵时,则以x、y对应列元素为横、纵坐标分别绘制曲线,曲线条数等于矩阵的列数。
>> t = linspace(0 ,2 * pi , 100); >> x = [t ; t]; >> clear >> t = linspace(0 ,2 * pi , 100); >> x = [t ; t]'; >> y = [sin(t) ; cos(t)]'; >> plot(x , y)
-
plot 函数最简单的调用格式是只包含一个输入参数,即 plot(x)。在这种情况下,当x是实向量时,则以该向量元素的下标为横坐标,元素值为纵坐标画出一条曲线,这实际上是绘制折线图。当x是复数向量时,则分别以该向量元素实部和虚部为横、纵坐标绘制出一条曲线。
>> t = 0 : 0.01 : 2 * pi; >> x = exp(i * t); >> plot(x)
注意:程序中的i是虚数单位,这样x是一个复数向量。为了保证这一点,i不能被赋其他的值。
当x是实矩阵时,则按列绘制每列元素值相对其下标的曲线,曲线条数等于x矩阵的列数。当输入参数是复数矩阵时,则按列分别以元素实部和虚部为横、纵坐标绘制多条曲线。
>> t = 0 : 0.01 : 2 * pi; >> x = exp(i * t); >> y = [x ; 2 * x ; 3 * x]'; >> plot(y)
-
-
含多个输入参数的plot函数
plot函数可以包含若干组向量对,每一向量对可以绘制出一条曲线。
plot(x1 , y1 , x2 , y2 ,...,xn , yn)
-
当输入参数都为向量时,x1和y1,x2和y2,…,xn和yn分别组成一组向量对,每一组向量对的长度可以不同。每一向量对可以绘制出一条曲线,这样可以在同一坐标内绘制出多条曲线。
>> x = linspace(0 , 2 * pi , 100); >> plot(x , sin(x) , x , 2 * sin(x) , x , 3 * sin(x))
-
当输入参数有矩阵形式时,配对的xy按对应列元素为横、纵坐标分别绘制曲线,曲线条数等于矩阵的列数。
>> x = linspace(0 , 2 * pi , 100); >> y1 = sin(x); >> y2 = 2 * sin(x); >> y3 = 3 * sin(x); >> x = [x ; x ; x]'; >> y = [y1 ; y2 ; y3]'; >> plot(x , y , x , cos(x))
x和y都是含有3列的矩阵,它们组成输入参数对,绘制出3根正弦曲线,x和cos(x)都是向量,它们组成输入参数对,绘制出一根余弦曲线。
-
-
含选项的plot函数
MATLAB提供了一些绘图选项,用于确定所绘曲线的线型、颜色和数据点标记符号。
线型选项:
选项 线型 选项 线型 - 实线(默认值) -. 点划线 : 虚线 – 双划线 颜色选项
序号 选项 颜色 序号 选项 颜色 1 b 蓝色 5 m 品红 2 g 绿色 6 y 黄色 3 r 红色 7 k 黑色 4 c 青色 8 w 白色 标记符号选项
选项 标记符号 选项 标记符号 . 点 v 朝下三角符号 o 圆圈 ^ 朝上三角符号 x 叉号 < 朝左三角符号 + 加号 > 朝右三角符号 * 星号 p 五角星符 s 方块符 h 六角星符 d 菱形符 要设置曲线样式可以在 plot函数中加绘图选项,其调用格式如下:
plot(x1,y1,选项1,x2,y2,选项2,..., xn, yn,选项n)
示例
>> x = (0 : pi / 100 : 2 * pi)'; >> y1 = 2 * exp(-0.5 * x) * [1 , -1]; >> y2 = 2 * exp(-0.5 * x) .* sin(2 * pi * x); >> x1 = (0 : 12) / 2; >> y3 = 2 * exp(-0.5 * x1) .* sin(2 * pi * x1); >> plot(x , y1 , 'k:',x , y2 ,'b--',x1 , y3 , 'rp');
-
双纵坐标函数plotyy
在 MATLAB中,如果需要绘制出具有不同纵坐标标度的两个图形,可以使用plotyy 函数,其调用格式如下:
plotyy(x1 , y1 , x2 , y2)
其中,x1,y1对应一条曲线,x2, y2对应另一条曲线。横坐标的标度相同,纵坐标有两个,左纵坐标用于xl, y1 数据对,右纵坐标用于x2, y2数据对。
双纵坐标图形能把函数值具有不同量纲、不同数量级的两个函数绘制在同一坐标中,有利于图形数据的对比分析。示例
>> x = 0 : pi / 100 : 2 * pi; >> y1 = exp(-0.5 * x) .* sin(2 * pi * x); >> y2 = sin(x); >> plotyy(x, y1 , x , y2);
5.1.2 绘制图形的辅助操作
→ 使图形意义更加明确、可读性更强。
-
图形标注
在绘制图形的同时,可以对图形加上一些说明,如图形名称、坐标轴说明以及图形某一部分的含义等,这些操作称为添加图形标注。
title(图形名称) xlabel(x轴说明) ylabel(y轴说明) text(x , y , 图形说明) legend(图例1 , 图例2 ,...)
title和xlabel、ylabel 函数分别用于说明图形和坐标轴的名称。text函数是在(x, y)坐标处添加图形说明。添加文本说明也可用gtext 命令,执行该命令时,十字坐标光标自动跟随鼠标移动,单击鼠标即可将文本放置在十字光标处。例如,使用gtext(cos(x))可放置字符串cos(x)。legend函数用于绘制曲线所用线型、颜色或数据点标记图例,图例放置在图形空白处,用户还可以通过鼠标移动图例,将其放到所希望的位置。除legend函数外,其他函数同样适用于三维图形,z坐标轴说明用zlabel函数。
LaTeX格式的控制字符:MATLAB可用的LaTeX字符集
一个在线LaTeX编辑器
https://latexlive.com/
-
坐标控制
利用axis函数对坐标系进行重新设定。
axis([xmin , xmax , ymin , ymax , zmin , zmax])
如果只给出前4个参数,则MATLAB按照给出的x、y轴的最小值和最大值选择坐标系范围,以便绘制出合适的二维曲线。如果给出了全部参数,则系统按照给出的3个坐标轴的最小值和最大值选择坐标系范围,以便绘制出合适的三维图形。
axis函数常用用法:
- axis equal:纵、横坐标轴采用等长刻度。
- axis square:产生正方形坐标系(默认为矩形)。
- axis auto:使用默认设置
- axis off:取消坐标轴。
- axis on:显示坐标轴。
给坐标加网格线用 grid命令来控制。grid on/off 命令控制是画还是不画网格线,不带参数的grid命令在两种状态之间进行切换。
给坐标加边框用box 命令来控制。box on/off 命令控制是加还是不加边框线,不带参数的box命令在两种状态之间进行切换。
示例——分段函数曲线并添加图形标注:
x = linspace(0 , 10 , 100); y = []; for x0 = x if x0 >= 8 y = [y , 1]; elseif x0 >= 6 y = [y , 5 - x0 / 2]; elseif x0 >= 4 y = [y , 2]; elseif x0 >= 0 y = [y , sqrt(x0)]; end end plot(x , y) axis([0 , 10 , 0 , 2.5]) title('分段函数曲线'); xlabel('Variable X'); ylabel('Variable Y'); text(2 , 1.3 , 'y=x^{1/2}'); text(4.5,1.9 , 'y=2'); text(7.3,1.5,'y=5-x/2'); text(8.5 , 0.9 , 'y=1');
-
图形保持
一般情况下,每执行一次绘图命令就刷新一次当前图形窗口,图形窗口原有图形将不复存在。若希望在已存在的图形上再继续添加新的图形,可使用图形保持命令hold. hold on/off命令控制是保持原有图形还是刷新原有图形,不带参数的hold命令在两种状态之间进行切换。
示例——用图形保持功能在同一坐标系内绘制
x = (0 : pi / 100 : 2 * pi)'; y1 = 2 * exp(-0.5 * x) * [1 , -1]; y2 = 2 * exp(-0.5 * x) .* sin(2 * pi * x); plot(x , y1, 'b:'); axis([0 , 2 * pi , -2 ,2]); hold on; plot(x , y2 , 'k'); legend('包路线','包路线','曲线y'); hold off; grid
-
图形窗口的分割
在实际应用中,经常需要在一个图形窗口内绘制若干个独立的图形,这就需要对图形窗口进行分割。分割后的图形窗口由若干个绘图区组成,每一个绘图区可以建立独立的坐标系并绘制图形。同一图形窗口中的不同图形称为子图。MATLAB 系统提供了subplot函数,用来将当前图形窗口分割成若干个绘图区。每个区域代表一个独立的子图,也是一个独立的坐标系,可以通过subplot 函数激活某一区,该区为活动区,所发出的绘图命令都是作用于活动区域。subplot函数的调用格式如下:
subplot(m , n , p)
该函数将当前图形窗口分成mxn个绘图区,即m行,每行n个绘图区
区号按行优先编号,且选定第p个区为当前活动区。在每一个绘图区允许以不同的坐标系单独绘制图形。示例——在一个图形窗口中以子图形式同时绘制正弦、余弦、正切、余切曲线。
x = linspace(0 , 2 * pi, 60); y = sin(x); z = cos(x); t = sin(x) ./ (cos(x) + eps); ct = cos(x) ./ (sin(x) + eps); subplot(2 ,2 ,1); % 选中2 x 2个区中的1号区 plot(x , y); title('sin(x)'); axis([0 , 2 * pi, -1, 1]); subplot(2 ,2 ,2); % 选中2 x 2个区中的2号区 plot(x , z); title('cos(x)'); axis([0 , 2 * pi, -1, 1]); subplot(2 ,2 ,3); % 选中2 x 2个区中的3号区 plot(x , t); title('tangent(x)'); axis([0 , 2 * pi, -40, 40]); subplot(2 ,2 ,4); % 选中2 x 2个区中的4号区 plot(x , ct); title('cotangent(x)'); axis([0 , 2 * pi, -40, 40]);
【更灵活的分割】
x = linspace(0 , 2*pi , 60); y = sin(x); z = cos(x); t = sin(x) ./ (cos(x) + eps); ct = cos(x) ./ (sin(x) + eps); subplot(2 , 2 , 1); % 选择2 x 2 个区中的1号区 plot(x , y -1); title('sin(x)-1'); axis([0 ,2*pi , -2, 0]); subplot(2 , 1 , 2); % 选择2 x 1 个区中的2号区 plot(x , z -1); title('cos(x)-1'); axis([0 ,2*pi , -2, 0]); subplot(4 , 4 , 3); % 选择4 x 4 个区中的3号区 plot(x , y); title('sin(x)'); axis([0 ,2*pi , -1, 1]); subplot(4 , 4 , 4); % 选择4 x 4 个区中的4号区 plot(x , z); title('cos(x)'); axis([0 ,2*pi , -1, 1]); subplot(4 , 4 , 7); % 选择4 x 4 个区中的7号区 plot(x , t); title('tangent(x)'); axis([0 ,2*pi , -40, 40]); subplot(4 , 4 , 8); % 选择4 x 4 个区中的8号区 plot(x , ct); title('cotangent(x)'); axis([0 ,2*pi , -40, 40]);