Matlab进阶教程1-二维绘图,包含基本的绘图函数,坐标系的切换,图形窗口,图形标注及特殊图形的绘制(饼图、条形图等)。
Matlab基础教程系列:
基本绘图函数
plot
最基本的绘图函数。执行plot
函数时,若当前已有图形窗口,则将图画在现有图形窗口上,覆盖原有图形;若当前没有图形窗口,则自动创建新的图形窗口。
X
和Y
必须是同维向量,绘制以X
为横坐标、Y
为纵坐标的曲线。若:
-
X
是向量,Y
是矩阵,则X
的维数应与Y
的某一维相等,绘制多条颜色不同的曲线,曲线数等于Y
的另一维数,X
则仍作为横坐标。当Y
是方阵时,Matlab会优先处理列,即绘制Y
的每一列对X
的曲线。
1 2 3
| x = 0:0.01:10; y = [sin(x);sin(x)+1;sin(x)-1]; plot(x,y); grid on;
|
-
X
是矩阵,Y
是向量时,规则同上,但**Y
会被当作横坐标**
-
X
与Y
皆为矩阵时,要求二者必须同维,以X
的每一列作为横坐标、以Y
对应对列元素作为纵坐标绘制曲线,曲线数等于列数。
1 2
| plot(x,y,LineSpec); plot(x,y,'--or');
|
LineSpec
是一个字符串,可以包含上述若干要素,基本线型、标记和颜色如下:
线型 |
说明 |
-(default) |
实线 |
-- |
虚线 |
: |
点线 |
-. |
点划线 |
颜色 |
说明 |
w |
白 white |
y |
黄 yellow |
c |
青 cyan |
g |
绿 green |
m |
品 magenta |
r |
红 red |
b |
蓝 blue |
k |
黑 black |
标记 |
说明 |
o |
圆圈 |
+ |
加号 |
* |
星号 |
. |
点 |
x |
叉号 |
s |
方形 square |
p |
五角形 pentagonal |
d |
菱形 diamond |
^ |
上三角 |
v |
下三角 |
> |
右三角 |
< |
左三角 |
h |
六角形 hexagon |
ps. 如果仅指定标记而忽略线型,则绘图时不会显示线条,只显示标记。
1 2
| plot(x1,y1,...,xn,yn); plot(x1,y1,LineSpec1,...,xn,yn,LineSpecn);
|
也可以使用hold on
命令,将不同的图画在同一个坐标系里。
1 2
| plot(y); plot(y,LineSpec)
|
- 若
y
是实向量,则x轴刻度范围为[1,length(y)]
- 若
y
是实矩阵,则按列绘制曲线,相当于plot(索引矩阵,y)
,自变量为索引
- 若
y
是复矩阵,则按列绘制曲线,相当于plot(real(y),imag(y))
,自变量为实部,因变量为虚部
1 2 3
| plot(ax,_); plot(_,Name,Value); h = plot(_);
|
图形线条属性可以通过输出h
来查看:
1 2 3 4 5 6 7 8 9
| Color: [0.8500 0.3250 0.0980] LineStyle: '-' LineWidth: 0.5000 Marker: 'none' MarkerSize: 6 MarkerFaceColor: 'none' XData: [1×1001 double] YData: [1×1001 double] ZData: [1×0 double]
|
修改示例如下:
1 2 3
| x = 0:0.01:10; y = [sin(x);cos(x)]; h = plot(x,y);
|
1 2
| >> h(2).YData = 0.1*x; >> h(1).LineStyle = '--';
|
此外,还有一些常用的属性如下
属性 |
说明 |
值 |
LineJoin |
线条边角样式 |
round(default) miter chamfer |
MarkerEdgeColor |
标记轮廓颜色 |
none(default) auto 颜色 |
fplot
专门用于绘制一元函数的命令。相比于plot()
根据指定数据点绘图,fplot()
会自适应地选取数据点,即在平滑处选取数据点稀疏、在陡峭处选取数据点密集,使图像更加光滑准确。
1 2
| fplot(f); fplot(f,x_interval);
|
f
为m文件函数名或系统自带函数名,x_interval
为一个二元向量,包含区间的两个端点。示例如下:
1
| fplot(@exp,[-1,1]); grid on;
|
1 2 3 4
| fplot(funx,funy);
fplot(funx,funy,t_interval);
|
funx
和funy
为参数方程函数名,t_interval
为一个二元向量,包含区间的两个端点。
1 2 3
| xt = @(t) 2*cos(t); yt = @(t) sin(t); fplot(xt, yt); grid on;
|
1 2 3 4
| fplot(_,LineSpec); fplot(_,Name,Value); fplot(ax,_); fp = fplot(_);
|
subplot
用于在同一个图形窗口中分割出多个视图区域。
对p
的编号采用从左至右、从上至下的原则。
1 2
| subplot(m,n,p,'replace'); subplot('Position',pos);
|
pos
的格式为[left, bottom, width, height]
,即以左下角坐标、宽度和高度定义,若新坐标区与原有坐标区重叠,则原有坐标区会被替换。
不同坐标系下的绘图
上述所有绘图命令均建立在平面直角坐标系中,下面介绍几种其他坐标系的绘图方法。
极坐标系 polarplot
与直角坐标系的plot
函数几乎一致,只是将x
换做theta
,将y
换做rho
1 2 3 4 5 6 7 8
| polarplot(theta,rho); polarplot(theta,rho,LineSpec); polarplot(theta1,rho1,...,thetan,rhon); polarplot(theta1,rho1,LineSpec1,...,thetan,rhon,LineSpecn); polarplot(z); polarplot(z,LineSpec); ploarplot(_,Name,Value); p = polarplot(_);
|
示例:
1 2 3 4
| theta = 0:0.01*pi:6*pi; rho1 = theta/10; rho2 = theta/12; polarplot(theta,rho1,'-b',theta,rho2,'--r');
|
坐标转化:
1 2 3 4
| [theta, rho] = cart2pol(x, y); [x, y] = pol2cart(theta, rho); R = deg2rad(D); D = rad2deg(R);
|
对数坐标系
对于某些变化迅速的变量,线性坐标可能无法形象展示其变化过程。若将部分或全部坐标取对数,就可以减缓变量的变化过程。常用的对数坐标系有:
semilogx()
- x轴为对数坐标,y轴为线性坐标
semilogy()
- y轴为对数坐标,x轴为线性坐标
loglog()
- x、y轴均为对数坐标
函数调用规则与plot
类似。示例如下:
1 2 3 4
| x = 0:0.01:10; y = exp(x); subplot(2,1,1); plot(x,y); grid on; subplot(2,1,2); semilogy(x,y); grid on;
|
ps. 对数以10为底
双y轴坐标系
对于同一个坐标系内的两条曲线,若二者的变化范围差距过大,会导致变化范围较小的曲线无法清晰显示。此时,可以使用yyaxis left
与yyaxis right
命令为坐标系创建两个y轴,并分别绘制。该命令仅起到定位作用,与subplot
类似。
示例如下:
1 2 3 4 5 6 7
| x = 0:0.01:10; y_large = sin(x); y_small = 0.1*cos(x); subplot(2,1,1); plot(x,y_large,x,y_small); grid on; subplot(2,1,2); grid on; yyaxis left; plot(x,y_large); yyaxis right;plot(x,y_small);
|
图形窗口
Matlab的图形窗口和命令行窗口是相互独立的,通过图形窗口可以修改和编辑图形界面、实现大量数据计算结果的可视化。
创建
使用figure
命令创建图形窗口
1 2 3 4 5
| figure figure(Name,Value); f = figure(_); figure(f); figure(num);
|
相关命令
命令 |
说明 |
set(f,[Name1,...],[Value1,...]) |
设定图形窗口的属性值 |
get(f) |
获取图形窗口的属性值 |
close close all |
关闭图形窗口 |
clf |
清空图形窗口(不会关闭) |
图形标注
坐标轴范围
使用axis(limit)
指定当前坐标区的范围,limit
只能是长度为4、6、8的向量。
1 2 3
| axis([Xmin,Xmax,Ymin,Ymax]); axis([Xmin,Xmax,Ymin,Ymax,Zmin,Zmax]); axis([Xmin,Xmax,Ymin,Ymax,Zmin,Zmax,Cmin,Cmax]);
|
图形注释
1 2 3 4 5 6
| fill(x,y,'color'); title('string'); xlabel('string'); ylabel('string'); zlabel('string'); text(x,y,'string');
|
可以配合num2str(num)
函数,为图像添加与数值有关的标注,字符串之间使用[]
衔接。
1 2 3 4 5
| x = 0:0.01:10; k = rand(1,1); y = sin(x) * k; plot(x, y); title(['k=', num2str(k)]);
|
图例
1 2 3 4 5
| legend(label1,...,labeln); legend(_,'Location',lcn);
legend(_,'Orientation',ornt);
|
网格线
1 2 3
| grid on; grid; grid minor;
|
绘制特殊图形
条形图bar
1 2
| bar(y); bar([1,2,3,4,5]);
|
当y
是m×n的矩阵时,创建m组,每组包含n个条形:
1 2 3 4 5 6
| bar(x,y); bar(_,width); bar(_,style);
bar(_,color); b = bar(_);
|
此外,还有其他形式的条形图,调用格式类似:
函数 |
说明 |
barh() |
水平条形图 |
bar3() |
竖直三维条形图 |
bar3h() |
水平三维条形图 |
区域图area
1 2 3 4 5
| area(x); area(x,y); area(x,Y); area(_,basevalue); ar = area(_);
|
1 2 3 4 5 6
| x = 0:0.5:5; Y = [ones(size(x)) rand(size(x))+1 rand(size(x))+1 rand(size(x))+1]; area(x,Y',-1);
|
饼图pie
1 2 3 4 5
| pie(x); pie(x,explode);
pie(x,labels); pie(x,explode,labels);
|
1 2 3 4
| x = [1, 3, 1, 5]; explode = [0, 0.1, 0.2, 0.3]; labels = {'无偏移', '偏移0.1', '偏移0.2', '偏移0.3'}; pie(x, explode, labels);
|
可以用pie3
绘制三维饼图。
直方图histogram
与polarhistogram
通过help
指令查询详细信息。
1 2
| x = randn(10000, 1); histogram(x);
|
1 2
| theta = [0.1 1.1 5.4 3.4 2.3 4.5 3.2 3.4 5.6 2.3 2.1 3.5 0.6 6.1]; polarhistogram(theta,6);
|
含误差的线图errorbar
1 2 3 4 5 6
| errorbar(y,err);
errorbar(x,y,err); errorbar(x,y,neg,pos); errorbar(_,ornt); e = errorbar(_);
|
1 2 3 4
| x = 1:10; y = x; err = [0.1:0.1:0.5, 0.1:0.1:0.5]; errorbar(x,y,err,'both');
|
离散图(针状图)stem
用法与plot
一致。
1 2 3 4
| y = 1:6; stem(y); hold on; stem(y+1,'filled');
|
可以用stem3
绘制三维针状图
阶梯图stairs
用法与plot
一致
1 2 3 4
| x = 0:0.1:2*pi; stairs(x, sin(x)); hold on; grid on; stairs(x, cos(x));
|
罗盘图compass
用箭头显示坐标为(u,v)的向量,u和v长度一致,箭头起点位于原点。
1 2
| compass(u,v); compass(z);
|
与其他画图函数类似,可以指定线型、标记符号和颜色,可以用对象保存图像。
1 2 3
| u = [1, 0, -3, 0]; v = [0, 2, 0, -4]; compass(u,v);
|
箭头图quiver
1 2
| quiver(x,y,u,v); quiver(u,v);
|
1 2 3 4 5 6 7
| [x, y] = meshgrid(-2:.2:2); z = x.*exp(-x.^2 - y.^2); [dx, dy] = gradient(z, .2, .2);
contour(x, y, z); hold on; quiver(x, y, dx, dy);
|