从本文开始,讲述使用MATLAB绘制等高线图,相关函数包括:3 s. G& ]/ k& ]$ O. S; U( g& C
- contour-矩阵的等高线图
- contourf-填充的二维等高线图
- contourc-低级等高线图计算
- contour3-三维等高线图
- contourslice-在三维体切片平面中绘制等高线
- clabel-为等高线图添加高程标签
- fcontour-绘制等高线: _2 j6 O" n, ~! K
本文讲述contour和contourf两个函数,用得最广泛,论文中经常能看到。. z9 R9 d( A5 }. }" I0 V W8 W
1 常用函数0 s; s4 i; d: _$ k M2 h- J
; b5 _. s' t# p/ O4 A6 z) N1 M/ l
在介绍等高线函数前,先介绍几个常用函数。9 ?3 F9 o: A F" s
1.1 linspace函数- J C; s* {" N) t- T5 P! m
linspace函数用于生成线性等间距矢量。5 | `: f9 a. g3 @, X1 D) B( k
用法如下
2 ^, K& o; \; m8 L" I$ vy = linspace(x1,x2)y = linspace(x1,x2,n)3 w; i' G- e; s' n% N% a2 r# [
用于在两点间均匀产生n个点,默认是100个点。6 e* M: b6 ^5 w) B! S6 N- z
y = linspace(0,pi,150);length(y)% z z: b+ L! B- }2 k$ |9 ?
返回值为150。6 g# @3 N ^( f
1.2 meshgrid函数/ p$ a* {3 N$ O) s, F! n
等高线图的对象为矩阵,因此需要将向量转化为矩阵。
9 E- }8 }3 e3 w$ o5 ]可采用meshgrid函数。
6 e- w4 R( W7 x! Y用法! \- h6 d2 l/ g/ c
[X,Y] = meshgrid(x,y)[X,Y] = meshgrid(x)[X,Y,Z] = meshgrid(x,y,z)[X,Y,Z] = meshgrid(x)
& H/ |2 r- N- b例如
# e5 I2 k: N8 G" U& f2 U2 W3 bclc %更多文章,www.52ocean.cn allclose ally = linspace(0,pi,4);Y = meshgrid(y);yY$ N+ S, l$ Q' z1 l# K+ l- N! ]! K1 Q
运行结果为
( K0 c8 y! u+ l3 o: B4 v( N' h8 `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.14167 a1 q, L7 e9 N/ V/ c; f2 D
2. contour和contourf函数
" g/ ]" L% Z& H m, t' {) z( M* u+ E/ m; h/ b/ v7 {/ x, D
2.1 用法
' [& {: E) j$ A8 g5 E/ A5 h- D. q, J0 Ycontourf(Z)contourf(X,Y,Z)contourf(___,levels)contourf(___,LineSpec)contourf(___,Name,Value)contourf(ax,___)M = contourf(___)[M,c] = contourf(___)' z1 V& q0 v- \1 u$ |2 {
contourf(Z) 创建一个包含矩阵 Z 的等值线的填充等高线图,其中 Z 包含 x-y 平面上的高度值。MATLAB® 会自动选择要显示的等高线。Z 的列和行索引分别是平面中的 x 和 y 坐标。5 P- b, a9 s6 n. |
contourf(X,Y,Z) 指定 Z 中各值的 x 和 y 坐标。- @, j; G2 r. [0 G4 d2 q: q
contourf(___,levels) 将要显示的等高线指定为上述任一语法中的最后一个参数。将 levels 指定为标量值 n,以在 n 个自动选择的层级(高度)上显示等高线。要在某些特定高度绘制等高线,请将 levels 指定为单调递增值的向量。要在一个高度 (k) 绘制等高线,请将 levels 指定为二元素行向量 [k k]。; R$ I0 Y& ]+ ^( x0 |
contourf(___,LineSpec) 指定等高线的线型和颜色。3 x6 h) _6 E. v6 Z! y. i" w
contourf(___,Name,Value) 使用一个或多个名称-值对组参数指定等高线图的其他选项。请在所有其他输入参数之后指定这些选项。有关属性列表,请参阅 Contour 属性。5 g9 n) H+ l, l1 F2 O( }* y7 q
contourf(ax,___) 在目标坐标区中显示等高线图。将坐标区指定为上述任一语法中的第一个参数。
$ w7 X& J4 b9 f) BM = contourf(___) 返回等高线矩阵 M,其中包含每个层级的顶点的 (x, y) 坐标。! R* F* {" N- Z8 [2 E) |# N' X+ u
[M,c] = contourf(___) 返回等高线矩阵和等高线对象 c。显示等高线图后,使用 c 设置属性。[1][2] contour和contourf函数用法完全一致。$ E4 B) |8 @) W* V
2.2 示例1
: }% O9 L1 b8 }7 y+ W6 M( Vclc %更多文章,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)& t+ ^3 `2 L" Z
这里绘制 函数在 和 上的图像。, Y1 W/ S! @" ^( l: a) B& g
左图为等高线图,只有线,颜色表示值的大小,黄色表示峰,蓝色表示谷。
- E5 @# Q& X# i右图为填充等高线图,色彩较为明艳,比较好看,因此用得比左图多。
, j9 ?0 h1 { d% I2 s( B) ` i2.3 示例2:改变等高线数目( \3 S- ~" K, t
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)0 u7 U c O ]3 c) }& r. F
等高线数目是等高线图的重要参数,2.2中的图从最高点到最低点,默认为7个线条。
$ ~/ Z; v. H* z" A3 H+ y这里,数量增加到14。不建议数目太多,看起来感觉乱,Ps密集恐惧症简直要犯了,也不建议太少。
1 ^& r. S8 E) Z! s! v2.4 示例3:显示特定层级
; Q7 c& B3 Q4 v6 e! H0 Q4 w oclc %更多文章,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])
/ w) A8 w( g7 r W2 Z3 r我们可以控制显示区间,例如这里只显示[-0.5 0.5]之间的数据,大于0.5位黄色,小于-0.5白色,深蓝色为中间值。
' Q3 [+ Q* M( X2.5 示例4:属性控制
5 |. K" p0 ?- E在图形句柄中有很多参数可以设定,包括颜色、线型、线宽、标签值等等。. Q: Y" b$ U( ?' y' {/ d7 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, 4, 'ShowText','on')subplot(1,2,2)contourf(X, Y, Z, 4,'ShowText','on')6 A a9 I" Q4 M; R& R
如,为每一条等高线添加数值标签,这个用的很多。
) `4 w: R6 f5 W+ D$ }" v( j& Eclc %更多文章,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 Q+ T4 X' q# q9 o也能改变线型和线宽。
8 R+ M8 l* q3 Y2.6 示例5:不显示某些特定值或区域
# T; G: c& |+ |8 Iclc %更多文章,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)& F. |" _/ j) d; f
论文中经常遇到某些值、区域不想显示出来,留作空白。那么可以让这些区域的坐标或者值抠除即可,采用NaN赋值即可,如上图所示。, d6 W; s; L. X' D: i
NaN即not a number。/ a3 S+ S9 j# w! c( h+ b0 D" i( j
持续更新,更多文章请见专栏和目录" Y! w$ x1 F/ K0 Y6 k
$ b4 L- g. X# h& W* G5 b专栏:MATLAB科学绘图
. d7 b( Z5 b5 T, x) y0 e/ ^3 z4 e" h8 E0 q4 |
MATLAB画图技巧与实例:目录6 ^- c5 c" U0 N0 @: X+ u, D, |
) X$ ?- r/ k& K7 `+ ]$ e l. x9 uMATLAB画图技巧与实例(一):常用函数
) J( b5 J1 A% |- _' T; y& F L9 f; k3 a" ?
# T+ _1 \6 {- Z6 }+ {' ~参考
9 M! N. o7 y- C5 b4 I1 s; D* x$ `2 s4 E
" [. Y3 f$ J d6 n# F5 W# l |