MATLAB 数据可视化的基础方法 本章学习目标 (1)掌握二维图形的绘制方法。 (2)掌握给图形添加标注的方法。 (3)掌握三维图形的绘制方法。 (4)熟悉MATLAB探查数据特性的其他方法。 数据可视化的基础方法是在二维/三维空间用点、线、面等展示数据的特性。本章首先 介绍MATLAB绘制二维图形的基本方法,以及在二维图形上添加标注和调整图形颜色的 方法,然后讲解绘制三维曲线和三维曲面的方法。最后介绍利用MATLAB提供的工具探 查数据的基本属性。 5.1 绘制二维图形 二维图形是绘制在平面上的图形,构成二维图形的主要元素是点和线。绘制二维图形, 通常采用笛卡儿坐标系,还可采用对数坐标系、极坐标系。 5.1.1 绘制曲线 MATLAB绘制二维曲线的基本方法是将平面上的数据点用线段连接起来。 1. plot 函数 plot函数用于绘制基于笛卡儿坐标系的曲线,基本调用格式为 plot(X, Y) 其中,参数X和Y分别存储要绘制的数据点的横坐标和纵坐标。 1)输入参数是向量 plot函数的输入参数X 和Y 通常是长度相同的向量,绘制曲线时,用X、Y 的元素值作 为数据点的横、纵坐标,用线段将各数据点连接起来,形成一条曲线。 例5.1 绘制曲线 x=sint+sin2t y=cost-cos2t { ,其中,t∈[0,2π]。 先构造向量t,将t 代入表达式计算,得到向量x、y,然后使用x、y 作为参数,调用plot 5 1 47 函数绘制曲线。程序如下。 t=linspace(0, 2*pi, 200); plot(sin(t)+sin(2*t), cos(t)-cos(2*t)); 运行程序,将打开一个图形窗口,在其中绘制出二维曲线,如图5.1(a)所示。 如果单位长度内的数据点太少,绘制的图形不能反映数据的变化特性,例如,将例5.1 程序的第一条语句改为“t=linspace(0,2*pi,10);”,即只定义10个数据点,绘制的图形如 图5.1(b)所示。 图5.1 例5.1程序绘制的二维曲线 单位长度的数据点越多,曲线越光滑;但数据点过多,又会影响运算速度,浪费存储和计 算资源。在实际应用中,可在调试程序时,观察图形随数据点个数的变化,选取合适的数据 点个数。 2)输入参数是矩阵 若plot函数的输入参数X、Y 是大小为m ×n 的矩阵,则依次用X、Y 对应列的元素值 为横、纵坐标绘制曲线,每列元素定义一条曲线数据点的坐标,曲线条数等于矩阵的列数。 例如,在同一坐标区中绘制三条幅值不同的正弦曲线,程序如下。 x = linspace(0,2*pi,100); y = sin(x); plot([x; x; x]',[y; y*2; y*3]') %或plot([x', x', x'],[y', y'*2, y'*3]) 输入参数[x;x;x]'、[y;y*2;y*3]'都是大小为100×3的矩阵。如果不转置,即用 [x;x;x]、[y;y*2;y*3]作为输入参数,将输出100条折线,每条折线上有3个数据点。 如果输入参数X、Y 一个是向量,一个是矩阵,则矩阵第1维度或第2维度的大小应与 向量的长度相同。当矩阵的行数与向量长度一致时,绘图时默认用矩阵的每列元素作为数 据点的坐标;当矩阵的列数与向量长度一致时,绘图时默认用矩阵的每行元素作为数据点的 坐标。例如,在同一坐标区中绘制三条幅值不同的正弦曲线,也可以使用以下程序。 x = linspace(0,2*pi,100); y = sin(x); plot(x, [y; y*2; y*3]) %或plot(x, [y; y*2; y*3]') 或plot(x', [y; y*2; y*3]) 1 48 3)输入参数只有一个 若输入参数Y 是实型向量,则以该向量元素的索引为横坐标、元素值为纵坐标绘制出 一条曲线;若输入参数Y 的元素是复数,则分别以元素实部为横坐标、虚部为纵坐标绘制一 条曲线。例如,绘制0°~360°的正弦曲线,可以使用以下命令。 x = 0:1:360; plot(sind(x)) %或plot(x+1i*sind(x)) 若输入参数Y 是矩阵,且Y 的所有元素是实数,则以每列元素的行下标为横坐标、以每 列元素的值为纵坐标绘制多条曲线,曲线条数等于输入参数Y 的列数;若Y 是复数矩阵,则 按列分别以元素实部、虚部为横、纵坐标绘制多条曲线。例如,绘制三个同心圆,程序如下。 t = linspace(0,2*pi,100); x = cos(t)+1i*sin(t); plot([x.', 2*x.', 3*x.']) 圆是一条闭合曲线,曲线起点与终点坐标相同。 4)多对输入参数 当plot函数有多对输入参数,且都为向量时,即 plot(x1, y1, x2, y2, … , xn, yn) 其中,x1和y1、x2和y2、…、xn和yn组成n 组向量对,分别以每一组向量对的元素为横、纵 坐标绘制出一条曲线。采用这种格式时,同组的向量长度必须一致,不同向量对的长度可以 不同。例如,在同一坐标区中绘制曲线x=cost+tsint,t∈[0,3π]和y=sint+tcost,t∈ [0,2π],程序如下。 t1 = linspace(0,3*pi, 90); x = cos(t1)+t1.*sin(t1); t2 = linspace(0,2*pi, 50); y = sin(t2)-t2.*cos(t2); plot(t1,x, t2,y); 2. fplot 函数 使用plot函数绘图时,先要取得横、纵坐标,然后再绘制曲线,横坐标往往采取等间距。 在实际应用中,表达两个变量关系的表达式随着自变量的变化趋势未知,或者在不同区段频 率特性差别大,此时使用plot函数绘制图形,如果数据点的间距设置不合理,则无法完整反 映表达式的原有特性。例如,绘制曲线sin1x ,x∈[0,0.1],程序如下。 x = eps:0.005:0.1; plot(x, sin(1./x)) 因为x 为0时,运算1x 无数学意义,因此x 的最小值设为eps(eps表示极小值2-52)。 1 49 图5.2(a)是步长为0.005时绘制的图形,图5.2(b)是步长为0.001时绘制的图形。图5.2(b)显 示,在0~0.1范围有多个振荡周期,因变量的值变化大,而0.04以后变化较平缓。当自变量的 间距设置为0.005时,绘制的曲线(图5.2(a))没有反映出0.01~0.04区段的变化规律。 图5.2 用不同步长绘制的曲线sin(1/x) MATLAB的fplot函数可以很好地解决此类问题。fplot函数根据输入参数表达式的 变化特性自适应地调整自变量元素的间距。因变量的值变化缓慢的区段,自变量元素间距 较大;因变量的值变化剧烈的区段,自变量元素间距较小。 1)基本调用格式 fplot函数的输入参数是表达式,表达式描述数据点纵坐标与横坐标的关系。fplot函 数的调用格式如下。 fplot(fun, lims) 其中,输入参数fun是定义数据点纵坐标的表达式,通常采用函数句柄的形式。lims为fun 的自变量的取值范围,用二元行向量[xmin,xmax]描述,省略时,lims默认为[-5,5]。例 如,绘制图形sin1x ,x∈[0,0.1],可以使用以下命令。 >> fplot(@(x)sin(1./x),[0,0.1]) 执行命令,绘制的图形如图5.3所示。图形显示,在0~0.01区间,函数对应的图形剧烈 振荡变化,这是上面调用plot函数绘制的图形完全没有表现出来的情形。对于某些数学上 无意义的数据点,fplot函数绘制图形时,会根据前后数据点的变化趋势拟合一个符合实际 情况的数据点,例如,此例中x 为0的点。 2)其他调用格式 如果数据点的横、纵坐标都是与某个变量相关的表达式,则fplot函数的调用格式如下。 fplot(funx, funy, lims) 其中,输入参数funx、funy是仅有一个自变量的表达式,通常采用函数句柄的形式。lims指 定这个变量的取值范围,用二元向量[tmin,tmax]表示,默认为[-5,5]。例如,例5.1中x、 1 50 图5.3 使用fplot函数绘制曲线sin(1/x) y 是用关于变量t 的表达式描述,绘制例5.1的图形也可以使用以下命令。 >> fplot(@(t)sin(t)+sin(2*t), @(t)cos(t)-cos(2*t), [0,2*pi]) plot函数的输入参数是数据点的坐标值,fplot函数的输入参数是描述数据点坐标的表 达式。使用plot函数和fplot函数求解同一个问题,方法有区别。 例5.2 已知f(x)= 1-e-1(1-x)2 , x<1 lnx, x≥1 { ,x∈[0,5]。 分别调用plot函数、fplot函数绘制曲线。 (1)调用plot函数绘制图形,先计算出数据点的横、纵坐标。定义一个匿名函数fun, 存储题目中的表达式。将表示横坐标的变量x 作为参数代入函数fun,计算纵坐标。由于 运算对象是变量x 的各个元素,因此,表达式中要使用数组运算符(.*和./)。程序如下。 fun = @(x)(1-exp(-(1-x).^2)).*(x<1)+log(eps+x).*(x>=1); x = 0:0.1:5; plot(x, fun(x)) 说明:log0无数学意义,为了避开计算log0,程序中将x 加上eps。运行以上程序,绘 制的图形如图5.4所示。 图5.4 例5.2程序绘制的图形 1 51 (2)调用fplot函数绘制图形,不需要计算出数据点的横、纵坐标,而需要指定绘图区 间。程序如下。 fun = @(x)(1-exp(-(1-x).^2)).*(x<1)+log(x).*(x >= 1); fplot(fun, [0,5]) 或者使用符号函数形式,程序如下。 syms x; fplot(1-exp(-(1-x)^2), [0,1-eps]) hold on fplot(log(x), [1,5]) 使用符号函数形式时,分两次绘制图形,两段曲线各使用一种颜色。调用fplot函数绘 制第二个图形时,系统会先清除前面的图形,通过holdon命令保持前一个图形,再继续绘 制第二个图形。 3. fimplicit 函数 如果给定了定义曲线的显式表达式,可以根据表达式计算出所有数据点坐标,调用plot 函数绘制图形;或者用函数句柄作为参数,调用fplot函数绘制图形。但如果曲线用隐函数 形式定义,如x3+y3-5xy+15 =0,y 没有直接表示为自变量x 的表达式,则不适合用plot 函数和fplot函数绘制图形。MATLAB提供了fimplicit函数绘制隐函数图形,其调用格式 如下。 fimplicit(f, [xmin, xmax, ymin, ymax]) 其中,输入参数f存储表达式,可以用匿名函数、函数句柄、符号函数表示;第2个输入参数 中,xmin和xmax指定绘图区水平方向的最小值和最大值,ymin和ymax指定竖直方向的 最小值和最大值。当ymin和ymax省略时,默认水平方向和竖直方向的绘图区间均为 [xmin,xmax]。当省略第2个输入参数时,水平和竖直方向的绘图区间默认为[-5,5]。 例5.3 绘制曲线x3+y3-5xy+15 =0,其中,x∈[-5,5],y∈[-5,5]。 使用匿名函数形式定义fimplicit函数的输入参数,命令如下。 >> fimplicit(@(x,y)x.*x.*x+y.*y.*y-5*x.*y+1/5) 执行命令,输出的图形如图5.5所示。 也可以使用符号函数形式定义fimplicit函数的输入参数,命令如下。 >> syms x y >> fimplicit(x*x*x+y*y*y-5*x*y+1/5) 1 52 图5.5 例5.3程序绘制的图形 4. 曲线样式 在一个坐标区绘制多条曲线时,为了加强对比效果,可设置不同线型和数据点标记区分 曲线。 1)线型 线型用字符串或字符向量描述,表5.1列出了MATLAB线条的线型可取值,未指定 时,默认线型为实线。下面以plot函数为例,说明线条线型的设置方法。 通常在调用plot函数、fplot函数、fimplicit函数绘制曲线时,用参数形式指定线型, 例如: x = linspace(0,2*pi,100); plot(x,sin(x),':', x,sin(2*x) ,'--', x,sin(3*x),'-.') 表5.1 MATLAB线条的线型 线型取值描 述表示的线条 "-" 实线 "--" 虚线 ":" 点线 "-." 点画线 "none" 无线条 也可以在绘制图形后,通过图形对象的LineStyle属性设置线型。例如: phs = plot(x,[sin(x); sin(2*x); sin(3*x)]); phs(1).LineStyle=":"; phs(2).LineStyle="--"; phs(3).LineStyle="-."; 除了设置线型,还可以通过LineWidth属性设置线条宽度,其值为正,以磅(1磅=1/72 1 53 英寸,1英寸=2.54厘米)为单位,省略时,默认为0.5。例如,设置第2条曲线的线宽为2,命 令如下。 phs(2).LineWidth = 2; 2)数据点标记 数据点标记用字符串或字符向量描述,表5.2列出了MATLAB数据点的标记可取值, 未指定时,不显示数据点标记。 表5.2 MATLAB数据点的标记 标 识 符标记样式标 识 符标记样式 '+' 加号s' ' 正方形 'o' 空心圆'd' 菱形 '*' 星号'^' 上三角形 '.' 点'v' 下三角形 'x' 叉号'>' 右三角形 -' ' 水平线条'<' 左三角形 |' ' 垂直线条p' ' 五角形 'h' 六角形 通常在调用plot函数、fplot函数、fimplicit函数绘制曲线时,用参数形式指定数据点标 记。例如,用五角形标记数据点,命令如下。 ph1 = plot([71, 69, 64, 67.5, 64], 'p'); 若仅指定数据点标记,则只呈现数据点,不显示线条;若同时指定数据点标记和线型,才 会既显示数据点标记,又显示曲线。也可以在绘制图形后,通过图形的Marker属性添加数 据点的标记。例如: ph = fplot(@(x)sin(x),[0,2*pi]); ph.Marker = "p"; 除了设置数据点的标记样式,还可以通过MarkerSize属性设置标记大小,其值以磅为 单位,省略时,默认为6。例如: ph.MarkerSize = 8; 5.1.2 管理坐标区 数据可视化的第一步是指定一个绘图区,然后相对这个区域内的原点绘制图形。在 MATLAB中,坐标区视为图形的容器,绘制图形都是在某个坐标区内。MATLAB绘制图 形的函数大多会在绘图时自动创建坐标区对象,然后在这个坐标区内绘制图形。 1 54 坐标系是能够使数据在指定维度空间内找到映射关系的定位系统,在数据可视化中,常 用的平面坐标系包括笛卡儿坐标系、对数坐标系和极坐标系。笛卡儿坐标系和对数坐标系 中的数据点用与原点的相对距离表示,笛卡儿坐标系坐标轴上的刻度是线性渐变的,对数坐 标系坐标轴上的刻度按对数规律变化。极坐标系中的数据点用极径和极角表示。 1. 设置坐标区刻度 绘制图形时,MATLAB根据绘制数据的值域自动创建坐标区,并确定合适的坐标刻 度,使得曲线尽可能完整、清晰地显示出来。 1)axis函数 若绘图时需要自己定义坐标区的坐标范围,可以调用axis函数来实现。axis函数的基 本调用格式如下。 axis([xmin, xmax, ymin, ymax, zmin, zmax, cmin, cmax]) 系统按照给出的三个维度的最小值(xmin,ymin,zmin)和最大值(xmax,ymax, zmax)设置坐标区范围,并按指定的颜色最小值cmin和最大值cmax建立数据与颜色的映 射关系。绘制二维图形时通常只给出横、纵坐标范围。例如,在绘制了二维曲线后,指定当 前坐标区的坐标范围,命令如下。 axis([-6, 5, -5.5, 4]) axis函数的其他用法如下。 (1)axisstyle。 style设置坐标区坐标呈现模式,可取值包括tight、padded、equal、square、fill和vis3d 等。tight样式指定坐标范围与数据值域相同,坐标区外轮廓与图形呈现区域无间距; padded样式指定坐标区外轮廓临近图形呈现区域,两者之间存在间距;equal样式指定坐标 区的每个轴使用相同的单位长度;square样式指定坐标区为正方形;fill样式启用“伸展填 充”(默认值),每个维度轴线的长度等于坐标区的Position属性所定义的矩形边长;vis3d样 式锁定纵横比。 例如,绘制一个边长为1的正方形,可以使用以下程序。 x = [0, 1, 1, 0, 0]; y = [0, 0, 1, 1, 0]; plot(x,y) axis padded %使曲线与坐标区轮廓不重合 axis square; %使图形呈现为正方形 运行以上程序,将绘制出如图5.6(a)所示图形。 (2)axismode。 mode用于设置坐标范围的调整模式。manual模式指定将所有坐标区范围锁定在当前 值;auto模式根据数据值域自动确定坐标区范围;'autox'模式根据表示水平位置的数据值 域自动确定x 轴范围;a' utoy'模式根据表示竖直位置的数据值域自动确定y 轴范围;a' utoz' 模式根据表示高度的数据值域自动确定z 轴范围;a' utoxy'、a' utoxz'、a' utoyz'分别表示自动 1 55 图5.6 边长为1的正方形 确定x-y 轴、x-z 轴、y-z 轴的范围。 (3)axisvisibility。 visibility用于设置坐标轴的可见性。on指定显示坐标轴,off指定不显示坐标轴。 2)坐标区对象的属性 建立坐标区后,可以通过坐标区对象的属性调整坐标区的外观。 (1)XLim,YLim,ZLim 属性。 XLim、YLim、ZLim 属性用于获取和设置坐标区的坐标范围,其值是一个二元向量,分 别对应坐标的最小值和最大值。例如,绘制上述正方形后,修改坐标区横轴的坐标范围,命 令如下。 >> ax = gca; >> ax.XLim = [-0.5 1.5]; 第1行命令通过预定义变量gca获取当前坐标区对象的句柄,存于变量ax。执行以上 命令,显示如图5.6(b)所示图形,横轴的坐标范围变为-0.5~1.5。 (2)XTick,YTick,ZTick属性。 坐标区坐标轴的刻度值默认是线性递增的。XTick、YTick、ZTick属性用于获取和设 置坐标区坐标轴的刻度。例如: >> ax.XTick = [-0.5 0.3 0.6 1.0 1.2]; 执行命令,横轴的刻度变为-0.5、0.3、0.6、1.0、1.2。 (3)XTickLabel,YTickLabel,ZTickLabel属性。 坐标区坐标轴的刻度标签默认采用刻度值。XTickLabel、YTickLabel、ZTickLabel属 性用于获取和设置坐标轴的刻度标签。例如: >> ax.XTickLabel = {"周一","周二","周三","周四","周五"};