Matlab 二维绘图
了解了 MATLAB 的矩阵和向量概念与输入方法之后,MATLAB 的二维绘图再简
单也不过了。假设有两个同长度的向量 x 和 y, 则用 plot(x,y) 就可以自
动绘制画出二维图来。如果打开过图形窗口,则在最近打开的图形窗口上绘制此
图,如果未打开窗口,则开一个新的窗口绘图。
〖例〗正弦曲线绘制:
>> t=0:.1:2*pi; %生成横坐标向量,使其为 0,0.1,0.2,...,6.2
y=sin(t); % 计算正弦向量
plot(t,y) %绘制图形
这样立即可以得出如图所示的二维图 [4.1(a)]
plot()
数还可以同时绘制出多条曲线,其调用格式和前面不完全一致,但也
好理解。
>> y1=cos(t); plot(t,y,t,y1); %或 plot(t,[y; y1]), 即输出为两个行向量
组成的矩阵。
图形见 4.1(b)。
plot() 函数最完整的调用格式为:
>> plot(x1,y1,选项 1, x2,y2, 选项 2, x3,y3, 选项 3, ...)
其中所有的选项如表 4.1 所示。一些选项可以连用,如 '-r' 表示红色实线。
由 MATLAB 绘制的二维图形可以由
下面的一些命令简单地修饰。如
>> grid % 加网格线
>> xlabel('字符串') % 给横坐标轴
加说明
>> ylabel('字符串') % 给纵坐标轴
加说明,
%并自动旋转 90 度
>> title('字符串') % 给整个图形
加图题得出的图形如右图所示。
axis() 函数可以手动地设置 x,y
坐标轴范围
还可以使用 plotyy() 函数绘制具
有两个纵坐标刻度的图形。
坐标系的分割在 MATLAB 图形绘制中是很有特色的,比较规则的分割方式
是用 subplot() 函数定义的,其标准调用格式为
subplot(n,m,k)
其中,n 和 m 为将图形窗口分成的行数和列数,而 k 为相对的编号。例如在标
准的 Bode 图绘制中需要将窗口分为上下两个部分 (即 n=2, m=1), 分割后上部
编号为 1,下部编号为 2。
MATLAB 的图形对象简介 ( 00-12-13)
MATLAB 从 4.0 版本开始就提出了句柄图形学 (Handle Graphics) 的概
念,为面向对象的图形处理提供了十分有用的工具。和早期版本的 MATLAB 相比
较,其最大区别在于,它在图形绘制时其中每个图形元素(比如其坐标轴或图形
上的曲线、文字等) 都是一个独立的对象。用户可以对其中任何一个图形元素进
行单独地修改,而不影响图形的其他部分,具有这样特点的图形称为向量化的绘
图。这种向量化的绘图
给每个图形元素分配一个句柄 (handle), 以后再对
该图形元素做进一步操作时,则只需对该句柄进行操作即可。
MATLAB 5.0 版进一步加强了图形绘制的功能,而 5.3 版绘图又具有自己的新特
色。例如它提供了新的图形编辑程序,并定义了一些新的三维绘图函数等。本章
将主要介绍 MATLAB 5.3 版本的应用与特性,并介绍部分有关句柄图形学的内
容。其余有关句柄图形学的问题,如窗口特性设置、图形界面
等项内容将在
第 6 章中讲述图形界面设计内容时详细介绍。MATLAB 6 也在图形显示,特别是
三维图形显示与照相机参数设置等方面引入了新鲜的内容。
MATLAB 定义的各种图形对象及其关系如下图所示。
对象的通用属性如下表所示。
获取和改变对象的属性可以采用 get() 和 set() 函数对来实现。
>> set(句柄, 属性 1,属性值 1, 属性 2,属性值 2,...)
>> 属性值=get(句柄,属性)
坐标轴对象时 MATLAB 图形中常用的对象,坐标轴对象可以用 MATLAB 5.3
上的菜单项添加。添加之后,可以用鼠标改变其大小和形状,其他一些属性说明
如下:
• Box 属性: 表示是否需要坐标轴上的方框,选项可以为 'on' 和
'off', 默认的值为 'on'。本书中在后面介绍属性值时,将把默认的属性
值列在前面。
• ColorOrder 属性: 设置多条曲线的颜色顺序,应该为一个 n x 3 矩阵,
可以由 colormap() 函数来设置。
• GridLineStyle 属性: 网格线类型,如实线、虚线等,其设置类似于 plot()
函数的选项,默认值为 ':',见前面的表格。
• NextPlot 属性: 表示坐标轴图形的更新方式,'replace' 是默认的选项,
表示重新绘制,而 'add' 选项表示在原来的图形上叠印,它相当于直接
使用 hold on 命令的效果。
• Title 属性: 本坐标轴标题的句柄。而其具体内容由 title() 函数设定,
由此句柄就可以访问到原来的标题了。
• XLabel 属性: x 轴标注的句柄,其内容由 xlabel() 函数设定。此外,
类似地还有 YLabel 和 ZLabel 属性等。
• XDir 属性: x 轴方向,可以选择 'normal' (正向) 和 'rev' (逆向), 此
外 YDir 和 ZDir 属性也是类似的。
• XGrid 属性: 表示 x 轴是否加网格线,可选值为 'off' 和 'on', 此外
还类似地有 YGrid 和 ZGrid 选项。
• XLim 属性: x 轴上下限,以向量 [xm,xM] 形式给出。此外,还有 YLim 和
ZLim 属性,前面介绍的 axis() 函数实际上是对这些属性的直接赋值。
• XScale 属性: x 轴刻度类型设置,可以为 'linear' (线性的) 和 'log'
(对数的)。此外还有 YScale 和 ZScale 属性。
XTick 和 XTickLabel 属性: XTick 属性将给出 x 轴上标尺点值的向量,而
XTickLabel 将存放这些标尺点上的标记字符串。对 y 和 z 轴也将有相应的标
尺属性,如 ZTick 等。
MATLAB 图形上的文字修饰 ( 00-12-12)
字符对象及其属性
文字标注是图形修饰中的重要因素,它可以是用户在窗口上随意添加的字
符说明,还可以是坐标轴对象中所用到的刻度标志等。字符对象的常用属性如下:
• Color 属性: 字符的颜色。该属性的属性值是一个 1x3 颜色向量。
• FontAngle 属性: 字体倾斜形式。如正常 'normal' 和斜体 'italic'
等。
• FontName 属性: 字体的名称。如 'Times New Roman' 与 'Courier' 等。
• FontSize 属性: 字号大小。默认以 pt 为单位,属性值应该为实数。
• FontWeight 属性: 字体是否加黑。可以选择 'light'、'normal' (默认
值)、'demi' 和 'bold' 4 个选项, 其颜色逐渐变黑。
• HorizontalAlignment 属性: 表示文字的水平对齐方式。可以有 'left'
(按左边对齐)、'center'
(居中对齐)、'right'(按右边对齐) 三种选择。类似地,对字符矩阵的位
置 还有 VerticalAlignment 属性。
• FontUnits 属性: 字体大小的单位。如 'points' (磅数,即 pt) 为默认
的值,此外,还可以使用如下单位 'inches' (英寸)、'centimeters' (厘
米)、'normalized' (归一值) 与 'pixels' (像素) 等。
• Rotation 属性: 字体旋转角度。可以为任何数值。
• Editing 属性: 是否允许交互式修改。选项可以为 'on' 和 'off'。
• String 属性: 构成本字符对象的字符串。可以是字符串矩阵。
• Interpreter 属性: 是否允许 TeX 格式。选项为 'tex' (允许 TeX 格式)
和 'none' (不允许) 两种,前者显示的效果好,而后者速度快。
• Extent 属性: 字符串所在的位置范围,是只读型的,1x4 向量,前两个
值表示字符串所在位置的左下角坐标,而后两个分量分别为字符对象的长
和高。
MATLAB 字符串中可以直接使用的一些 TeX 命令见表 4-3。
〖例〗给出下面的 MATLAB 命令
>> t=['\partial(f_ip)/\partialt=-\Sigma_{i=1}^n\partial(f_ip)/',...
'\partialx_i + 0.5\Sigma_{i=1}^n\Sigma_{j=1}^n',...
'\partial^2(b_{ij}p)/\partialx_i\partialx_j'];
tt=str2mat(t,'Y(\omega)=\int_0^\infty y(t)e^{-j\omegat}dt');
[x,y]=ginput(1); text(x,y,tt);
则将得出如下图所示的结果。看见较复杂的数学公式也可以在 MATLAB 窗口中显
示出来。
〖例〗分形理论是一个很有趣的领域,在这里我们给出一个简单的例子。任意选定一个
二维平面上的初始点坐标 (x0, y0),假设我们可以生成一个在 [0,1] 区间上均匀分布的随
机数 γi,那么根据其取值的大小,可以按下面的公式生成一个新的坐标点 (x1,y1):
从新坐标再根据随机数计算下一个点,如此类推。可以将上面的算法编写出下面
的 MATLAB 函数
function [x,y]=frac_tree(x0,y0,v,N)
x=[x0; zeros(N-1,1)]; y=[y0; zeros(N-1,1)];
for i=2:N
vv=v(i);
if vv<0.05, y(i)=0.5*y(i-1);
elseif vv<0.45,
x(i)=0.42*(x(i-1)-y(i-1)); y(i)=0.2+0.42*(x(i-1)+y(i-1));
elseif vv<0.85,
x(i)=0.42*(x(i-1)+y(i-1)); y(i)=0.2-0.42*(x(i-1)-y(i-1));
else,
x(i)=0.1*x(i-1); y(i)=0.1*y(i-1)+0.2;
end
end
调用此函数,我们可以由下面的 MATLAB 命令
生成 10,000 个这样的点,并将这些点在
MATLAB 图形窗口中用点的形式表示出来,如图
所示。
>> N=10000; v=rand(N,1);
[x,y]=frac_tree(0,0,v,N);
h=plot(x(1:10000),y(1:10000),'.'),
给出下面的命令可以设置绘图点的大小:
>> set(h,'MarkerSize',4)
对大的 N 值,计算量大,可以考虑采用 MEX C
格式改写 MATLAB 函数以加快速度。
命令“\it”表示其后面跟着的字母是斜体!命令“\rm”表示其后面跟着的字母
是正常字体!