MATLAB数学建模:数据图形可视化

数据图形可视化

用图表和图形展现数据的技术被称为 数据图形可视化. 在本文中, 我们将简介MATLAB数据图形绘制机能. MATLAB 提供了丰富的绘图函数和绘图工具, 这些函数或工具的输出均显示在 MATLAB 命令窗口外的图形窗口中.




1. 创建和关闭图形窗口

在 MATLAB 中, 我们可使用函数 Figure 建立图形窗口.

在 MATLAB 控制台中输入 Figure(int), 即可得到名为整数 int 的图形框. 图形框名默认为 1. 1.

我们可以使用"图形编辑工具条"对图形进行编辑和修改, 亦可使用光标右键菜单栏对图形实行操作.

使用 close 指令可以关闭图形窗口. 其调用方式:

close                   %关闭当前图形窗口.
close(x)                %关闭指定的图形窗口.
close name              %关闭指定名称的图形窗口.
close all               %保留隐藏图形窗口, 关闭其余所有图形窗口.
close all hidden        %关闭所有图形窗口.
status = close(...)     %返回调用close函数关闭图形窗口的状态. 

%% 清除当前图形窗口内容可用的命令:
clf                     %清除当前窗口所有可见图形对象
clf reset               %清除当前窗口所有可见图形对象, 并设置窗口属性值为默认. 

2. 绘制函数

利用MATLAB的某些内置绘图函数可以轻松实现函数可视化.


2.1 一元函数绘图

使用函数 ezplot 绘制任意的一元函数:

1. ezplot(f)
2. ezplot(f,[min,max])
3. ezplot(x,y)
4. ezplot(f,[xmin,xmax,ymin,ymax])
5. ezplot(x,y,[tmin,tmax])
  1. x x 的默认取值范围绘制函数图形.
  2. 按照 x x 指定的取值范围绘制函数图形.
  3. 按默认取值范围绘制 x = x ( t ) , y = y ( t ) x = x(t), y = y(t) .函数图形.
  4. 按照指定的, x , y x,y 的取值范围绘制 x = x ( t ) , y = y ( t ) x = x(t), y = y(t) .函数图形.
  5. 按照 t t 的取值范围绘制 x = x ( t ) , y = y ( t ) x = x(t), y = y(t) .函数图形.

[例]

绘制蔓叶线图形:
y 2 ( 3 + x ) ( 3 x ) 3 y^{2}(3+x)-(3-x)^{3}

[解]

>> f = '(y.^2)*(3 + x) - (3 - x).^3';
>> ezplot(f)

代码执行结果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OhcrvGo3-1581254282381)(./MATLAB程序设计训练和测试/蔓叶线图形.jpg)]


[例]

绘制 Archimede 螺线 (设 a = 3 a = 3 ) :

[解]

>> syms x y t;
>> x = 3.*(cos(t) + t.*sin(t));
>> y = 3.*(sin(t) - t.*cos(t));
>> ezplot(x,y,[0,810])
>> 

代码执行结果如下:
fig1


2.2 二元函数绘图

对于二元函数 z = f ( x , y ) , z = f(x,y), 同样可使用符号函数提供的函数 ezmesh 绘制各类图形, 也可以使用 meshgrid 函数获得矩阵 z z , 或用循环语句计算矩阵 z z 的元素.

  1. 函数 ezmesh
    该函数调用格式如下:
    1. ezmesh(f)
    2. ezmesh(f,domain)
    3. ezmesh(x,y,z)
    4. ezmesh(x,y,z,[smin,smax,tmin,tmax])
    5. ezmesh(... ,n)
    6. ezmesh(...,'circ')
    
    1. 按照 x , y x,y 默认取值范围绘制二元函数 f f 的图形.
    2. 按照 domain 指定的取值范围绘制二元函数 f f 的图形.
    3. 按照 参数 s , t s,t 的默认取值范围绘制函数 x = x ( s , t ) , y = y ( s , t ) , z = z ( s , t ) x = x(s,t), y = y(s,t),z = z(s,t) 的图形.
    4. 按照指定的取值范围[smin,smax,tmin,tmax] 绘制函数 f ( x , y ) f(x,y) 的图形.
      5.调用 ezmesh 绘制图形时, 同时绘制 n n n*n 的网格,默认 n = 60. n = 60.
    5. 调用 ezmesh 绘制图形时, 以指定区域的中心绘制图形.

[例]

绘制函数
z = ( 1 x 2 y ) . z = \sqrt{(1-x^{2}-y)}.

[解]

syms x y;
f = 'sqrt(1-x.^2-y)';
ezmesh(f,20)

代码执行如下:
fig2


  1. 函数 meshgrid
    二元函数 z = f ( x , y ) z = f(x,y) 的因变量由两个自变量 x , y x,y 决定. z z 本质上是三位空间的一个曲面. MATLAB 将 z z 存储于一个矩阵中, 其行和列分别表示为;
    z ( i , : ) = f ( x , y ( i ) ) z(i,:) = f(x,y(i))
    z ( : , j ) = f ( x ( j ) , y ) z(:,j) = f(x(j),y)
    z = f ( x , y ) z = f(x,y) 可用简单的表达式所表示时, 我们调用 meshgrid 函数即可方便地获取所有 z z 的数据. 随后,我们调用 surf 函数即可绘制出二元函数的图形.

[例]

绘制函数
z = ( x 2 1.5 x ) e x 2 y 2 x y . z = (x^{2}-1.5x)e^{-x^{2}-y^{2}-x^{y}}.

[解]

[x,y]=meshgrid(-3:0.1:3,-2:0.1:2);
z=(x.^2-1.5*x).*exp(-x.^2-y.^2-x.*y);
mesh(x,y,z);
subplot(2,2,1);
surf(x,y,z);
view(0,90);
subplot(2,2,2);
surf(x,y,z);
view(90,0); 
subplot(2,2,3);
surf(x,y,z);
view(0,0);
subplot(2,2,4);
surf(x,y,z);

代码执行结果如下:
fig3


此外, 在某些特殊情况下,我们也可以使用循环语句获取原本只需要使用 meshgrid 函数即可获得的矩阵数据.


3. 数据图形绘制

利用数据可视化方法, 我们可以通过图形这一展示方式, 从杂乱的离散数据中观察数据间的内在关联.


3.1 离散数据可视化

任何二元实数标量对 ( x a , y a ) (x_{a},y_{a}) 可在一个平面上表示一个点, 任何二元实数向量对 ( X , Y ) (X,Y) 可在平面上表示一组点.

对于离散实函数 y n = f ( x n ) y_{n} = f(x_{n}) , 当 X = [ x 1 , x 2 , , x n ] X = [x_{1},x_{2},\cdots, x_{n}] 以递增或递减的次序取值时, 有 Y = [ y 1 , y 2 , , y n ] Y = [y_{1},y_{2},\cdots,y_{n}] . 将该向量对用直角坐标序列点展示时, 即实现了离散数据的可视化.

当处理离散量时, 我们可以使用 离散序列图 来表示离散量的变化情况. 在 MATLAB 中, 我们使用 stem 实现离散图形的绘制:

  1. stem(y)

    x = 1 , 2 , 3 , x = 1,2,3,\cdots 作为每个数据点的 x x 轴的坐标, 以向量 y y 的值作为纵坐标. 在 ( x , y ) (x,y) 坐标点处绘制一个空心圆, 并连接一条线段至 X X 轴.

[例]

绘制一个离散序列图:

figure
t = linspace(-11.4,51.4,8);
h = stem(t);
set(h(1),'MarkerFaceColor','blue')
set(h(2),'MarkerFaceClolr','red','Marker','square')

图形输出如下:
fig4


  1. stem(x,y,'option')

x x 的各个元素为横坐标, 以 y y 的各个元素为纵坐标, 在 ( x , y ) (x,y) 坐标点绘制一个空心圆, 并连接一条线段至 X X 轴. 可通过 options 选项控制绘图时的线型和颜色等设置.


  1. stem(x,y,'filled')

    x x 的各个元素为横坐标, 以 y y 的各个元素为纵坐标, 在 ( x , y ) (x,y) 坐标点绘制一个实心圆, 并连接一条线段至 X X 轴.

[例]

stem 函数绘制一个线型为圆圈的离散序列图:

figure
x = 0:20;
y = [exp(-0.05*x).*cos(x);exp(0.06*x).*cos(x)]';
h = stem(x,y);
set(h(1),'MarkerFaceColor','blue')
set(h(2),'MarkerFaceColor','red','Marker','square')

输出图形如下;
fig5

注:除了使用 stem 命令外, 我们也可以直接使用离散数据绘制离散图形.

[例]

用图形表示离散函数:
y = 1 n 6 ,     n = 1 , 2 , , 10. y = \frac{1}{|n-6|}, \ \ \ n = 1,2,\cdots, 10.

[解]

n = 0:10            %产生一组十个自变量
y = 1./abs(n-6);    %计算对应的函数值
plot(n,y,'r*','MarkerSize',25)
%使用费尺寸25的红色星号标记函数点
grid on             %绘制坐标方格

输出图形如下:
fig6


3.2 连续函数可视化

我们可以对连续函数取一组离散自变量, 并计算函数值, 再用相同方法显示.

MATLAB在简易二维画图中会标出相应的离散数据点, 并且将这些点直接相连. 点越多, 绘制的曲线越平滑.

[例]

用图形表示连续调制波形
y = s i n ( t ) s i n ( 9 t ) . y = sin(t)sin(9t).

[解]

t1 = (0:12)/12 *pi;         %自变量取12+1 = 13个点
y1 = sin(t1).*sin(9*t1);    %计算函数值
t2 = (0:50)/50 *pi;         %自变量取51个点
y2 = sin(t2).*sin(9*t2);    
subplot(2,2,1);             %在子图1上绘制
plot(t1,y1,'r.');           %设定数据点颜色为红色
axis([0,pi,-1,1]);          %定义坐标大小
title('SubPlot 1');         %定义子图标题

%子图2数据点为红色
subplot(2,2,2);
plot(t2,y2,'r.');
axis([0,pi,-1,1]);
title('SubPlot 2');

%子图3用直线连接红色的数据点
subplot(2,2,3);
plot(t1,y1,t1,y1,'r.')
axis([0,pi,-1,1]);
title('SubPlot 3');

%子图4用直线连接数据点
subplot(2,2,4);
plot(t2,y2)
axis([0,pi,-1,1]);
title('SubPlot 4');

输出图形如下:
fig7


4. 二维绘图函数

本节将简介二维绘图中的常用函数及其用法.

4.1 二维绘图基本准备

  1. 准备数据

    选择需要展现的数据范围, 产生自变量采样向量. 计算相应的函数值并生成函数值向量. 若需要绘制二维曲线, 则需要准备横纵坐标数据. 若要绘制三维曲面, 则需要准备矩阵参变量和对应的 z z 轴坐标.

  2. 指定图形窗口和子图位置

    我们使用 figure 命令指定图形窗口. 该函数默认将打开 Figure1 或当前已经打开的窗口或子图. 我们还可以使用 subplot 指定当前子图.

  3. 绘制图形

    根据数据绘制曲线后, 设置曲线的绘制参数, 包括线型, 颜色, 数据点形状等.

  4. 设置坐标轴和图形注释

    设置坐标的范围, 刻度和坐标分割线等, 并设定包括图名, 坐标名, 图例, 文字说明等的图形注释.
    格式:

     title('图名')       %指定图名
     xlabel('x轴名')     %指定x轴名
     ylabel('y轴名')     %指定y轴名
     legend('指定图例')  %图例
     text(2,0.5,'函数')  %指定文字
     axis([xmin,xmax,ymin,ymax])     %设置坐标轴范围
     grid on             %绘制坐标分割线
    
  5. 精细修饰图形
    我们可以利用对象或图形窗口的菜单和工具栏进行设置, 属性设定则需要使用图形句柄进行操作.

  6. 按指定格式保存或导出图形
    将绘制的图形保存为指定格式的文件.


4.2 二维绘图基本命令

二维图形绘图命令 plot 调用格式如下:

1. plot(X,'s')
2. plot(X,Y,'s')
3. plot(X1,Y1,'s1',X2,Y2,'s2',...)
  1. X X 是实向量时, 以向量元素的下标为其横坐标, 元素值为纵坐标绘制一连续曲线. X X 为实矩阵时, 按列绘制每列元素值对应其下标的曲线, 曲线数目等于 X X 矩阵的列数. X X 是复数矩阵时, 按列分别以元素实部和虚部为横, 纵坐标绘制多条曲线.
  2. X , Y X, Y 为同维向量时, 绘制以 X , Y X,Y 元素为横, 纵坐标的曲线. X X 为向量, Y Y 是有一维和 X X 等维的矩阵时, 则绘出多根不同颜色的曲线. 曲线数等于 Y Y 的另一维数, X X 作为这些曲线的共同坐标. X X 为矩阵, Y Y 为向量时, 情况同上, Y Y 作为共同坐标. X , Y X,Y 是同维矩阵时, 以 X , Y X,Y 对应的元素为横, 纵坐标分别绘制曲线, 曲线数目等于矩阵的列数.
  3. s1 , s2 是用于指定线型, 颜色, 数据点形的字符串.

[例]

绘制连续调制波形及其包络线.

[解]

t = (0:pi/100:4*pi)';               %生成长度为101的时间采样序列
y1 = sin(t)*[1,-1];                 %包络线的函数值:一个101*2矩阵
y2 = sin(t).*sin(9*t);              %生成一个长101的调制波列向量
t3 = pi*(0:9)/9;
y3 = sin(t3).*sin(9*t3);
plot(t,y1,'r:',t,y2,'b',t3,y3,'b*')  %绘制三组曲线
axis([0,2*pi,-1,1])                 %控制数轴范围

输出图形如下:
fig8

[例]

采用模型:
x 2 a 2 + y 2 25 a 2 = 1 \frac{x^{2}}{a^{2}} + \frac{y^{2}}{25-a^{2}} = 1
绘制一组椭圆.

[解]

th = [0:pi/50:2*pi]';
a = [0.5:.5:4.5];
X = cos(th)*a;
Y = sin(th)*sqrt(25 - a.^2);
plot(X,Y)
axis = ('equal')
xlabel('x')
ylabel('y')
title('A Set Of Eclipses')

输出图形如下:
fig9


4.3 快速方程式绘图

MATLAB中的快速方程式绘图函数包括 fplotezplot.

  1. fplot
    该函数功能为单纯地绘制方程式图形, 图形的 ( x , y ) (x,y) 坐标值会由函数自行获取, 但是需要输入 x x 坐标的范围. 调用语法如下:

     fplot('函数',[xmin,xmax])
    
  2. ezplot
    该函数功能类似于 fplot, 但可以绘出显函数, 隐函数和参数式. 调用格式如下:

     1. ezplot('函数方程',[xmin,xmax,ymin,ymax])
     2. ezplot('x参数式','y参数式',[tmin,tmax])
    

[例]

使用 ezplot 函数绘制参数式:
x = c o s ( 5 t ) ,     y = s i n ( 5 t ) ,     t [ 0 , 2 π ] x = cos(5t), \ \ \ y = sin(5t), \ \ \ t \in [0,2\pi]

[解]

ezplot('cos(5*t)','sin(3*t)',[0,2*pi])

输出图形如下:
fig10


4.4 特殊二维图形

在使用基本绘图函数时,它们所输出的图形坐标轴刻度均为线性刻度. 然而, 当实际问题的数据出现指数变化时, 就无法直观地使用基本绘图函数表现数据的指数变化. 为解决这个问题, 我们需要使用 MATLAB 所提供的多种特殊的绘图函数.

i. 特殊坐标图形的绘制
此处的"特殊坐标"是指非 Descartes 坐标系, 具体包括极坐标系, 对数坐标系. 柱坐标系和球坐标系.

4.4.1.1 极坐标系

polar 函数可用于描绘极坐标图象. 其调用格式为:

polar(theta,rho,LineSpec)

其中, theta 为极角, rho 为极轴, LineSpec 为控制图中线型, 符号和颜色的绘图格式控制参量.

[例]

绘制心型曲线:
a = -2*pi:.001:2*pi; b = (1-sin(a)); polar(a,b,'r')
输出图形如下:
fig11


4.4.1.2 对数坐标系

MATLAB 提供了绘制不同形式的对数坐标曲线的功能. 具体实现的函数有:
semilogx, semilogx(y), semilogy.

  1. semilogx, semilogy

    x x ( y y ) 轴对数坐标图. 即:使用该函数绘制图形时 x x ( y y ) 轴将使用对数坐标.


  1. semilogx(y)
    y y 为实数向量或矩阵, 则 semilogx(y) 结合 y y 列向量的下标和 y y 的列向量绘制出线条. 若 y y 为复向量或复矩阵, 则 semilogx(y) 此时等价于 semilogx(real(y).image(y)).

    [例]

    y = [1+1*i, 4+5*i, 1+4*i, 8+1*i, 0+3*i, 6+4*i];
    semilogx(y)
    

    输出图形如下:
    fig12


4.4.1.3 柱坐标系和球坐标系

在 MATLAB 中没有在柱坐标和球坐标下直接绘制图形的命令, 但我们仍可以使用 pol2cart , sph2cart命令将待绘制的柱坐标或球坐标值转换为直角坐标下的坐标值, 并在直角坐标下绘制数据图形.

pol2cart 命令调用格式如下:

[x,y] = pol2cart(theta,rho,)
[x,y,z] = pol2cart(theta,rho,z)

sph2cart 命令调用格式如下:

[x,y,z] = sph2cart(theta,phi,r)

[例]

在直角坐标系下绘制柱坐标数据的图形:

theta = 0:pi/20:2*pi;
rho = sin(theta);
[t,r] = meshgrid(theta,rho);
z = r.* t;
[X,Y,Z] = pol2cart(t,r,z);
mesh(X,Y,Z)

输出图形如下:
fig13


4.4.1.4 绘制特殊二维图形

在 MATLAB 中, 还有其余可用来绘制不同类型的二维图形的绘图函数.:

1. bar(横坐标,纵坐标)                   %绘制条形图
2. fplot(某个函数,[精确绘图范围])        %精确绘图
3. polar(极角,函数)                     %绘制极坐标图像
4. stairs(横坐标,纵坐标)                %绘制阶梯图
5. line([x1,y1],[x2,y2],...)           %绘制折线图
6. fill(横坐标,纵坐标,点的颜色)          %绘制实心图
7. scatter(横坐标,纵坐标,面积,颜色)      %绘制散点图
8. pie(x)                              %绘制饼图
9. contour(x)                          %绘制等高线

5. 三维绘图函数


5.1 绘制三维曲面


5.2 生成栅格数据


5.3 绘制网格曲面


发布了33 篇原创文章 · 获赞 14 · 访问量 7138

猜你喜欢

转载自blog.csdn.net/u010186354/article/details/104240842