抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

MATLAB作图

曲线图

MATLAB作图是通过描点、连线来实现的,故在画一个曲线图形之前,必须先取得该图形上的一系列的点的坐标(即横坐标和纵坐标),然后将该点集的坐标传给MATLAB函数画图。
plot(X,Y,S)

X,Y为向量,分别表示点集的横坐标和纵坐标
S表示连线的类型
y 黄色 . 点 - 连线
m 洋红 o 圈 : 短虚线
c 蓝绿色 x x-符号
-. 长短线 r 红色 + 加号 – 长虚线

plot(X,Y1,S1,X,Y2,S2,...,X,Yn,Sn)

将多条线画在一起

例如:

[0,2π][0, 2\pi]用红线画sin(x)sin(x),用绿圈画cos(x)cos(x)

1
2
3
4
x=linspace(0,2.*pi,30);
y=sin(x);
z=cos(x);
plot(x,y,'r',x,z,'go')

learn2_plot.jpg

符号函数(显函数、隐函数和参数方程)画图

fplot('fun',lims)
表示绘制字符串funfun指定的函数在lims=[xmin,xmax]lims=[x_{min},x_{max}]的图形.

  • fun必须是M文件的函数名或是独立变量为x的字符串.
  • fplot函数不能画参数方程和隐函数图形,但在一个图上可以画多个图形.
例如:

[12][-1,2]上画y=e2x+sin(3x2)y=e^{2x}+sin(3x^2)的图形。

  1. 先建M文件myfun1.m
1
2
function Y=myfun1(x)
Y=exp(2*x)+sin(3*x.^2)
  1. 再输入命令
    fplot(‘myfun1’,[-1,2])

对数坐标图

在很多工程问题中,通过对数据进行对数转换可以更清晰地看出数据的某些特征,在对数坐标系中描绘数据点的曲线,可以直接地表现对数转换.
对数转换有双对数坐标转换和单轴对数坐标转换两种.
loglog函数可以实现双对数坐标转换.
semilogxsemilogy函数可以实现单轴对数坐标转换.

对数坐标就是它的数值增长跟到原点的距离不是线性关系,而是对数关系。
例如正常横坐标轴:x1,2,3,...,nx \rightarrow 1,2,3,...,n
而对数坐标轴就是:x101,102,103,...,10nx \rightarrow 10^1,10^2,10^3,...,10^n
在对于变化量激增的数据来说对数坐标轴比较好表示

三维图形

空间曲线

一条曲线

plot3(x,y,z,s)
x,y,zx,y,z表示曲线上点集的横坐标、纵坐标、纵坐标。
ss表示连线的类型,见上文

例如:

在区间[0,10π][0,10\pi]画出参数曲线x=sint,y=cost,z=tx=sint,y=cost,z=t.

1
2
t=0:pi/50:10*pi;
plot3(sin(t),cos(t),t)

learn2_plot3.jpg

多条曲线

plot3(x,y,z)
其中x,y,zx,y,z是都是m×nm×n矩阵,其对应的每一列表示一条曲线.

例如:

画多条曲线观察函数Z=(X+Y)2Z=(X+Y)^2

1
2
3
4
x=-3:0.1:3;y=1:0.1:5;
[X,Y]=meshgrid(x,y);
Z=(X+Y).^2;
plot3(X,Y,Z)

learn2_plot3_meshgrid.jpg

展开讲一讲meshgrid这个函数。
在文档中的应用是[X, Y]=meshgrid(x,y) 基于向量xxyy中包含的坐标返回二维网格坐标。坐标XXYY表示的网格有length(y)length(y)个行和length(x)length(x)个列。
例子
image5fbbd67368bd9e9a.png
可以注意到,列数跟xx是相同的,行数跟yy是相同的。
XX中可以看到数据只有我们输入的xxYY同理。
XX是一行行摆数据,而YY是一列列摆数据。

空间曲面

surf(x,y,z)

surf(x,y,z)分别表示数据点的横坐标、纵坐标、函数值。
画出数据点(x,y,z)(x,y,z)表示的曲面。

例如:

画函数Z=(X+Y)2Z=(X+Y)^2的图形.

1
2
3
4
5
6
x=-3:0.1:3;
y=1:0.1:5;
[X,Y]=meshgrid(x,y);
Z=(X+Y).^2;
surf(X,Y,Z)
shading flat %将当前图形变得平滑

learn2_surf.jpg

有点美耶…

mesh(x,y,z)

mesh(x,y,z)画网格曲面。

例如:

画出曲面Z=(X+Y)2Z=(X+Y)^2在不同视角的网格图。

1
2
3
4
5
x=-3:0.1:3;
y=1:0.1:5;
[X,Y]=meshgrid(x,y);
Z=(X+Y).^2;
mesh(X,Y,Z)

learn2_mesh.jpg

感觉还是surf好看

meshz(X,Y,Z)

meshz(x,y,z)在网格周围画一个curtain图(如,参考平面)

?看不懂了

例如:

绘peaks的网格图

1
2
3
[X,Y]=meshgrid(-3:.125:3);
Z=peaks(X,Y);
meshz(X,Y,Z)

learn2_meshz.jpg

图形处理

在图形上加格栅、图例和标注

加格栅

GRID ON加格栅在当前图上
GRID OFF删除格栅
learn2_grid.jpg

开了格栅,关了格栅就没有浅灰色的那些线

加图例

xlabel(string)在当前图形的x轴上加图例string
ylabel(string)在当前图形的y轴上加图例string
zlabel(string)在当前图形的z轴上加图例string
title(string)在当前图形的顶端上加图例string
image-1.png

这个二维坐标系没有z轴,不过大差不差

加标注

gtext(‘string’)
命令gtext(‘string’)用鼠标放置标注在现有的图上.
运行命令gtext('string')时,屏幕上出现当前图形,在图形上出现一个交叉的十字,该十字随鼠标的移动移动,当按下鼠标左键时,该标注string放在当前十交叉的位置.
learn2_gtext.jpg

输完命令之后图像会出现一个十字标,选择一个位置左键一下就可以标注函数名称了。

定制坐标

axis([xmin xmax ymin ymax zmin zmax])定制图形坐标

x、y、z的最大、最小值

axis auto将坐标轴返回到自动缺省值
learn2_axis.jpg

可以看到axis限定了x轴和y轴的范围

图形保持

hold on 保持当前图形, 以便继续画图到当前图上
hold off 释放当前图形窗口
figure(h) 新建h窗口,激活图形使其可见,并把它置于其它图形之上

例如:

区间[0,2π][0,2\pi]新建两个窗口分别画出y=sin(x),z=cos(x)y=sin(x),z=cos(x).

1
2
3
4
5
6
7
8
9
x=linspace(0,2*pi,100);
y=sin(x);
z=cos(x);
plot(x,y);
title('sin(x)');
pause
figure(2);
plot(x,z);
title('cos(x)');

割窗口

h=subplot(mrows,ncols,thisplot) 划分整个作图区域为mrows*ncols块(逐行对块访问)并激活第thisplot块,其后的作图语句将图形画在该块上.
subplot(mrows,ncols,thisplot)激活已划分为mrows*ncols块的屏幕中的第thisplot块,其后的作图语句将图形画在该块上.
subplot(1,1,1) 命令subplot(1,1,1)返回非分割状态.

subplot(2,2,1)表示把屏幕分成222*2,在第一块上画图。

例如

将屏幕分割为四块,并分别画出y=sin(x)z=cos(x)a=sin(x)×cos(x),b=sin(x)cos(x)y=sin(x),z=cos(x),a=sin(x)\times cos(x),b=\frac{sin(x)}{cos(x)}.

1
2
3
4
5
6
7
8
x=linspace(0,2*pi,100);
y=sin(x);
z=cos(x);
a=sin(x).*cos(x);b=sin(x)./(cos(x)+eps)
subplot(2,2,1);plot(x,y),title('sin(x)')
subplot(2,2,2);plot(x,z),title('cos(x)')
subplot(2,2,3);plot(x,a),title('sin(x)cos(x)')
subplot(2,2,4);plot(x,b),title('sin(x)/cos(x)')

缩放图形

zoom on 为当前图形打开缩放模式
单击鼠标左键,则在当前图形窗口中,以鼠标点中的点为中心的图形放大2倍;单击鼠标右键,则缩小2倍.
zoom off 关闭缩放模式

没啥用

改变视角view

view(a,b) 改变视角到(a,b)(a,b),aa是方位角,bb为仰角.默认视角为(37.5,30)(-37.5,30).
view([x,y,z]) 用空间向量表示的,三个量只关心它们的比例,与数值的大小无关,xxview([1,0,0])yyview([0,1,0])zzview([0,0,1]).

两个参数的用法view(azimuth, elevation),其中:

  • azimuth(方位角):这是水平旋转的角度。0度通常指向图形的正前方,正值将图形绕y轴逆时针旋转,负值将图形绕y轴顺时针旋转。
  • elevation(俯仰角):这是垂直旋转的角度。0度通常表示视图位于图形的水平面上方,正值将视图上升,负值将视图下降.

结合分块可以画出不同视角的三维图

1
2
3
4
5
6
7
8
x=-3:0.1:3;
y=1:0.1:5;
[X,Y]=meshgrid(x,y);
Z=(X+Y).^2;
subplot(2,2,1), mesh(X,Y,Z)
subplot(2,2,2), mesh(X,Y,Z),view(50,-34) %表示以方位角 50 度和俯仰角 -34 度的视角观察图形.
subplot(2,2,3), mesh(X,Y,Z),view(-60,70) %表示以方位角 -60 度和俯仰角 70 度的视角观察图形.
subplot(2,2,4), mesh(X,Y,Z),view([0,1,1]) %只看y轴和z轴

learn2_view.jpg

动画

moviein(),getframe,movie() 函数moviein()产生一个帧矩阵来存放动画中的帧;函数getframe对当前的图像进行快照;函数movie()按顺序回放各帧.

例如:

将曲面peaks做成动画

1
2
3
4
5
6
7
8
9
[x,y,z]=peaks(30);
surf(x,y,z)
axis([-3 3 -3 3 -10 10])
m=moviein(15)
for i=1:15
view(-37.5+24*(i-1),30)
m(:,i)=getframe;
end
movie(m)

旋转动画

特殊二、三维图形

特殊的二维图形函数

极坐标图

polar(theta,rho,s)
用角度theta(弧度表示)和极半径rho作极坐标图,用s指定线型.

例如:

r=sin2θ×cos2θr=sin2\theta\times cos2\theta的极坐标图形

1
2
3
4
theta=linspace(0,2*pi)
rho=sin(2*theta).*cos(2*theta);
polar(theta,rho)
title('Polar plot of sin(2*theta).*cos(2*theta)');

learn2_polar.jpg

散点图

scatter(X,Y,S,C)
在向量XXYY的指定位置显示彩色圈.XXYY必须大小相同.

1
2
load seamount
scatter(x,y,5,z)

learn2_scatter.jpg

seamount.mat 数据集包含了有关海底山脉的数据,其中包括海底山脉的位置坐标(经度和纬度)以及与每个位置相关的深度数据。这个数据集通常用于示范如何在 MATLAB 中创建各种类型的图表,如散点图、三维曲面图等,以展示地理或地形数据的可视化。

平面等值线图

contour(x,y,z,n)
绘制nn个等值线的二维等值线图

例如:

在范围2<x<2,2<y<3-2 < x < 2,-2 < y < 3 内绘 z=xex2y2z=xe^{-x^2-y^2}的等值线图

1
2
3
4
5
[X,Y]=meshgeid(-2:.2:2,-2:.2:3);
Z=X.*exp(-X.^2-Y.^2);
[C,h]=contour(X,Y,Z);
clabel(C,h) %如果没有这句话,等值线上就没有数字
colormap cool %寒冷的cool,用冷色调着色,不是酷~~~

learn2_contour.jpg

特殊的三维图形函数

空间等值线图

contour3(x,y,z,n)
其中n表示等值线数.

例如:

山峰的二维和三维等值线图

1
2
3
4
5
6
7
8
[x,y,z]=peaks;
subplot(1,2,1),contour3(x,y,z,16,'s')
grid on,xlabel('x-axis'),ylabel('y-axis')
zlabel('z-axis')
title('contour3 of peaks');
subplot(1,2,2),contour(x,y,z,16,'s')
grid, xlabel('x-axis'), ylabel('y-axis')
title('contour of peaks');

learn2_contour3.jpg

三维散点图

scatter3(X,Y,Z,S,C)
在向量X,YX,YZZ指定的位置上显示彩色圆圈.
向量X,YX,YZZ的大小必须相同.

例如:

绘制三维散点图.

1
2
3
4
5
6
7
[x,y,z]=sphere(16); %调用sphere函数会在当前的图形窗口中创建一个单位半径的球体,通常以灰色或其他默认颜色呈现。
X=[x(:)*.5 x(:)*.75 x(:)];
Y=[y(:)*.5 y(:)*.75 y(:)];
Z=[z(:)*.5 z(:)*.75 z(:)];
S=repmat([1 .75 .5]*10,prod(size(x)),1);
C=repmat([1 2 3],prod(size(x)),1);
scatter3(X(:),Y(:),Z(:),S(:),C(:),'filled'),view(-60,60)

learn2_scatter3.jpg

repmat()函数用法:B = repmat(A, m, n)

  • A是要重复的数组或矩阵。
  • m是要在垂直方向重复的次数。
  • n是要在水平方向重复的次数。
  • B是生成的重复数组或矩阵。
    prod()计算矩阵或数组中所有元素的乘积
    size(x)返回x的行数和列数
    所以prod(size(x))会得到这个矩阵的元素个数

评论