从本文开始,讲述使用MATLAB绘制等高线图,相关函数包括:
! T: U4 z% y- L3 }3 z+ _- contour-矩阵的等高线图
- contourf-填充的二维等高线图
- contourc-低级等高线图计算
- contour3-三维等高线图
- contourslice-在三维体切片平面中绘制等高线
- clabel-为等高线图添加高程标签
- fcontour-绘制等高线) K7 S# N* d2 ~; {9 E+ c& T
本文讲述contour和contourf两个函数,用得最广泛,论文中经常能看到。
8 x7 q, C/ h3 ]8 R6 M; M$ S1 常用函数
9 f, l& a8 U! k/ l* j4 s% H$ O( Q8 Q
在介绍等高线函数前,先介绍几个常用函数。. {7 _, N! [5 U3 n% n
1.1 linspace函数+ |6 x$ o& y1 A1 l3 r
linspace函数用于生成线性等间距矢量。$ D; ?. F. \$ S+ b1 I9 y
用法如下8 |- h; Z' n4 o: i5 ~1 y
y = linspace(x1,x2)y = linspace(x1,x2,n)$ J& ]( k3 R3 p2 n
用于在两点间均匀产生n个点,默认是100个点。5 t% k0 [! _# E0 _0 X
y = linspace(0,pi,150);length(y), `. _8 r& H- Z4 p/ ^" C
返回值为150。% h7 U7 V0 c: |5 C$ S2 [2 K8 P
1.2 meshgrid函数
) r& S+ Z9 X' k B' B, L等高线图的对象为矩阵,因此需要将向量转化为矩阵。* R( f0 _- L" i7 h2 J
可采用meshgrid函数。% q( y$ @) Q8 Q% v/ k2 \2 z
用法$ P" R/ i& J( ^7 m9 @% k5 O* i1 F8 m# c' ?
[X,Y] = meshgrid(x,y)[X,Y] = meshgrid(x)[X,Y,Z] = meshgrid(x,y,z)[X,Y,Z] = meshgrid(x)4 T2 b+ Z% u0 b# B: N- x- Q
例如6 U- n" M' i: o% N" {
clc %更多文章,www.52ocean.cn allclose ally = linspace(0,pi,4);Y = meshgrid(y);yY
% t0 g5 f5 m+ z3 m运行结果为
. B9 k7 Z/ x. H3 K( q' \y = 0 1.0472 2.0944 3.1416Y = 0 1.0472 2.0944 3.1416 0 1.0472 2.0944 3.1416 0 1.0472 2.0944 3.1416 0 1.0472 2.0944 3.1416
- y& O1 [: c* {1 ?2 p2. contour和contourf函数- [( q! e+ ]. h& m2 n
7 R" c: l4 T( b; p2.1 用法
2 g) S; H; K1 \) Ycontourf(Z)contourf(X,Y,Z)contourf(___,levels)contourf(___,LineSpec)contourf(___,Name,Value)contourf(ax,___)M = contourf(___)[M,c] = contourf(___)' t3 r; C! U% `; } q+ n5 J1 W V
contourf(Z) 创建一个包含矩阵 Z 的等值线的填充等高线图,其中 Z 包含 x-y 平面上的高度值。MATLAB® 会自动选择要显示的等高线。Z 的列和行索引分别是平面中的 x 和 y 坐标。' G# V) \% f: [! D5 p
contourf(X,Y,Z) 指定 Z 中各值的 x 和 y 坐标。" C9 H) Y. u/ X7 \4 Z8 z/ M# d
contourf(___,levels) 将要显示的等高线指定为上述任一语法中的最后一个参数。将 levels 指定为标量值 n,以在 n 个自动选择的层级(高度)上显示等高线。要在某些特定高度绘制等高线,请将 levels 指定为单调递增值的向量。要在一个高度 (k) 绘制等高线,请将 levels 指定为二元素行向量 [k k]。
. q) S0 o2 i% P) t6 _contourf(___,LineSpec) 指定等高线的线型和颜色。+ \4 k8 M# U. c: G
contourf(___,Name,Value) 使用一个或多个名称-值对组参数指定等高线图的其他选项。请在所有其他输入参数之后指定这些选项。有关属性列表,请参阅 Contour 属性。- q. |: g+ w K+ C% \, x l, _2 W
contourf(ax,___) 在目标坐标区中显示等高线图。将坐标区指定为上述任一语法中的第一个参数。9 }; V, A" j2 d6 N( N; R
M = contourf(___) 返回等高线矩阵 M,其中包含每个层级的顶点的 (x, y) 坐标。
3 A z: T) U- e0 U8 S: f5 c- ?[M,c] = contourf(___) 返回等高线矩阵和等高线对象 c。显示等高线图后,使用 c 设置属性。[1][2] contour和contourf函数用法完全一致。- {1 R; x, s2 o+ t
2.2 示例1
: ^ X& I" R2 e' O: p- s: _clc %更多文章,www.52ocean.cn allclose allx = linspace(0,10,100);y = linspace(0,10,100);[X, Y] = meshgrid(x,y);Z = cos(5*X/pi) + sin(5*Y/pi);subplot(1,2,1)contour(X, Y, Z)subplot(1,2,2)contourf(X, Y, Z)
: d! O- P4 w5 i# f$ r这里绘制 函数在 和 上的图像。8 Z& w, }# }& Q% ~( H7 g2 U
左图为等高线图,只有线,颜色表示值的大小,黄色表示峰,蓝色表示谷。
) S5 o* B9 i( U1 z( o8 {4 o右图为填充等高线图,色彩较为明艳,比较好看,因此用得比左图多。
) j% z/ Y1 P) i3 R6 @" O2.3 示例2:改变等高线数目5 g3 `! a3 K' t% d. H0 X
clc %更多文章,www.52ocean.cn allclose allx = linspace(0,10,100);y = linspace(0,10,100);[X, Y] = meshgrid(x,y);Z = cos(5*X/pi) + sin(5*Y/pi);subplot(1,2,1)contour(X, Y, Z, 14)subplot(1,2,2)contourf(X, Y, Z, 14)
: c: a. E6 Y2 F% Q% E" E等高线数目是等高线图的重要参数,2.2中的图从最高点到最低点,默认为7个线条。! o" U8 P$ R) L7 }! s$ h* a
这里,数量增加到14。不建议数目太多,看起来感觉乱,Ps密集恐惧症简直要犯了,也不建议太少。
: C9 L8 _ w9 B3 I1 n, H2.4 示例3:显示特定层级* x! y: l! S* h. _
clc %更多文章,www.52ocean.cn allclose allx = linspace(0,10,100);y = linspace(0,10,100);[X, Y] = meshgrid(x,y);Z = cos(5*X/pi) + sin(5*Y/pi);subplot(1,2,1)contour(X, Y, Z, [-0.5 0.5])subplot(1,2,2)contourf(X, Y, Z, [-0.5 0.5])
1 T$ `# j0 `/ r我们可以控制显示区间,例如这里只显示[-0.5 0.5]之间的数据,大于0.5位黄色,小于-0.5白色,深蓝色为中间值。
( F; M4 O1 P4 t% d) e6 I. O2.5 示例4:属性控制
2 y/ n9 l; [. b: o& {3 d在图形句柄中有很多参数可以设定,包括颜色、线型、线宽、标签值等等。" x9 } R! p8 g+ E9 H7 t! L7 E
clc %更多文章,www.52ocean.cn allclose allx = linspace(0,10,100);y = linspace(0,10,100);[X, Y] = meshgrid(x,y);Z = cos(5*X/pi) + sin(5*Y/pi);subplot(1,2,1)contour(X, Y, Z, 4, 'ShowText','on')subplot(1,2,2)contourf(X, Y, Z, 4,'ShowText','on')
. ]9 h$ z& U5 W$ C- p如,为每一条等高线添加数值标签,这个用的很多。6 i. s( I1 }8 x% Q) T; O1 w) f' B
clc %更多文章,www.52ocean.cn allclose allx = linspace(0,10,100);y = linspace(0,10,100);[X, Y] = meshgrid(x,y);Z = cos(5*X/pi) + sin(5*Y/pi);subplot(1,2,1)contour(X, Y, Z, '--','linewidth',2)subplot(1,2,2)contourf(X, Y, Z, 4,'-.','linewidth',2)* }1 g2 Z! o) \) X# s4 c
也能改变线型和线宽。7 J8 _/ s! Q% ?) u
2.6 示例5:不显示某些特定值或区域
3 N3 u% x" v! P, S8 eclc %更多文章,www.52ocean.cn allclose allx = linspace(0,8,100);y = linspace(0,5,100);[X, Y] = meshgrid(x,y);Z = cos(5*X/pi) + sin(5*Y/pi);X(45:55, = NaN;Y(:,45:55) = NaN;contourf(X, Y, Z)
+ ~8 R, |, R) I: E3 }+ f论文中经常遇到某些值、区域不想显示出来,留作空白。那么可以让这些区域的坐标或者值抠除即可,采用NaN赋值即可,如上图所示。7 T- w/ y. H/ |8 T
NaN即not a number。
) i9 X5 ]5 E3 V/ U1 U持续更新,更多文章请见专栏和目录
- e* w) @! V3 e8 Y9 o, X! k9 V8 T2 r- r* k
专栏:MATLAB科学绘图
. J+ F4 W/ q4 C* z) W0 w5 d( Y
# K F' t8 s `" |- j5 g9 }MATLAB画图技巧与实例:目录# l) M* u; U( ]8 F
* o2 E: t! e) {& [; jMATLAB画图技巧与实例(一):常用函数
5 ]4 n, z9 e# \9 m5 R6 S* U7 u0 p1 T9 j
& `5 ?+ ]7 X* q4 m: D2 l# R
参考
# ^1 S1 g' D& L3 W3 a! X7 j0 w6 i5 Y; O3 T$ G
. r* z) Y! \0 d9 u |