从本文开始,讲述使用MATLAB绘制等高线图,相关函数包括:0 ]5 a! h! _/ y" D1 n2 F6 i
- contour-矩阵的等高线图
- contourf-填充的二维等高线图
- contourc-低级等高线图计算
- contour3-三维等高线图
- contourslice-在三维体切片平面中绘制等高线
- clabel-为等高线图添加高程标签
- fcontour-绘制等高线, N5 m% h) I) S; v# c
本文讲述contour和contourf两个函数,用得最广泛,论文中经常能看到。
7 t& [* i \' O8 M8 u1 常用函数1 s. i2 \. W2 K
" k# o% P8 y8 J$ i, e c在介绍等高线函数前,先介绍几个常用函数。
1 [- e* Z0 c; Y+ a1 J2 m1.1 linspace函数( }: Z/ t5 j2 \( c
linspace函数用于生成线性等间距矢量。
4 `- P5 k" g! B6 O" Y* a+ o用法如下& v4 Y5 G3 |" f+ B, d I0 F7 B
y = linspace(x1,x2)y = linspace(x1,x2,n)
9 }( K! _! m: \8 J: k. X! b7 e用于在两点间均匀产生n个点,默认是100个点。$ F$ x5 O, |. f2 a
y = linspace(0,pi,150);length(y)+ B$ a) Z3 W% e/ ]' m
返回值为150。4 J% M4 b+ ?" F5 t$ a( ^
1.2 meshgrid函数; c9 B3 z$ u; K# r3 U5 R6 d* X% y
等高线图的对象为矩阵,因此需要将向量转化为矩阵。% i5 P! ?* \+ d
可采用meshgrid函数。
" P/ Q" Y' Q- ]5 M2 W用法8 s2 \+ U4 G- V- G6 R- Q; s; H
[X,Y] = meshgrid(x,y)[X,Y] = meshgrid(x)[X,Y,Z] = meshgrid(x,y,z)[X,Y,Z] = meshgrid(x)5 x3 e/ Q- _* Y3 i! R
例如
4 h- N7 a; M ]0 ^clc %更多文章,www.52ocean.cn allclose ally = linspace(0,pi,4);Y = meshgrid(y);yY
) Q; ^3 s5 J) c5 q7 B8 K3 M/ z运行结果为2 e& ^% ~: _. f; e W1 u4 }5 u
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
4 |% l( H" E6 b3 V$ l2. contour和contourf函数; \% h: l5 N& p
7 S ^* n6 M: k( Y2.1 用法. T$ [1 I% n- G0 k
contourf(Z)contourf(X,Y,Z)contourf(___,levels)contourf(___,LineSpec)contourf(___,Name,Value)contourf(ax,___)M = contourf(___)[M,c] = contourf(___)9 U9 i+ @# n5 W5 K; L. j: o/ x
contourf(Z) 创建一个包含矩阵 Z 的等值线的填充等高线图,其中 Z 包含 x-y 平面上的高度值。MATLAB® 会自动选择要显示的等高线。Z 的列和行索引分别是平面中的 x 和 y 坐标。
$ p, Y7 h j: P% rcontourf(X,Y,Z) 指定 Z 中各值的 x 和 y 坐标。
6 [' J) P( p. j3 ?, ~8 Kcontourf(___,levels) 将要显示的等高线指定为上述任一语法中的最后一个参数。将 levels 指定为标量值 n,以在 n 个自动选择的层级(高度)上显示等高线。要在某些特定高度绘制等高线,请将 levels 指定为单调递增值的向量。要在一个高度 (k) 绘制等高线,请将 levels 指定为二元素行向量 [k k]。, |/ a; f d) F! g) ?2 X
contourf(___,LineSpec) 指定等高线的线型和颜色。5 I3 ?" ~6 ~6 b3 x% D/ M
contourf(___,Name,Value) 使用一个或多个名称-值对组参数指定等高线图的其他选项。请在所有其他输入参数之后指定这些选项。有关属性列表,请参阅 Contour 属性。* i7 o8 m2 `& `7 u3 d- c' \$ G
contourf(ax,___) 在目标坐标区中显示等高线图。将坐标区指定为上述任一语法中的第一个参数。- \- C( {( ?+ T* G
M = contourf(___) 返回等高线矩阵 M,其中包含每个层级的顶点的 (x, y) 坐标。. n, J; F9 k ^
[M,c] = contourf(___) 返回等高线矩阵和等高线对象 c。显示等高线图后,使用 c 设置属性。[1][2] contour和contourf函数用法完全一致。
2 U7 l* p, y8 y) C3 @7 n2.2 示例1
$ }6 i. w1 P, m# k' Y/ [" [" Aclc %更多文章,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)
6 \3 k; ^& F) U' S) j8 E这里绘制 函数在 和 上的图像。$ h% p% i4 k2 t1 I
左图为等高线图,只有线,颜色表示值的大小,黄色表示峰,蓝色表示谷。
6 H# ?& P; B! M: |# @. c( ^) C. c右图为填充等高线图,色彩较为明艳,比较好看,因此用得比左图多。 ` x+ a/ O0 i2 i
2.3 示例2:改变等高线数目
! |1 K! e6 ~' L/ q S1 |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$ S* ?+ ~/ G; ]+ h等高线数目是等高线图的重要参数,2.2中的图从最高点到最低点,默认为7个线条。( p- W1 N6 H1 Z% `' r" z+ J1 T2 M
这里,数量增加到14。不建议数目太多,看起来感觉乱,Ps密集恐惧症简直要犯了,也不建议太少。1 Y0 q7 q" j( n z4 @2 Q5 H% D) J
2.4 示例3:显示特定层级6 G6 k. r! q b: w' 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, [-0.5 0.5])subplot(1,2,2)contourf(X, Y, Z, [-0.5 0.5])8 Y, a( U+ g, m* u* f3 ~5 o
我们可以控制显示区间,例如这里只显示[-0.5 0.5]之间的数据,大于0.5位黄色,小于-0.5白色,深蓝色为中间值。
6 n/ M; {% T( {9 T9 v+ B2.5 示例4:属性控制
8 x3 o( x" b7 C/ Z/ D在图形句柄中有很多参数可以设定,包括颜色、线型、线宽、标签值等等。4 V3 }7 \) g& ]1 w, N7 @
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')
1 o' M+ z8 m: X* J2 Q$ k" B如,为每一条等高线添加数值标签,这个用的很多。
7 Z8 J8 e8 E) | jclc %更多文章,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)) x* m* U# t2 r7 b* p, d) d
也能改变线型和线宽。) X* t3 t5 p/ M9 `9 a( u, B
2.6 示例5:不显示某些特定值或区域( b& u* p: C- u/ E7 i) O) X; n
clc %更多文章,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)5 N; S1 D" I2 Y: C
论文中经常遇到某些值、区域不想显示出来,留作空白。那么可以让这些区域的坐标或者值抠除即可,采用NaN赋值即可,如上图所示。
: l9 M% ^( w2 L/ GNaN即not a number。
0 ^! x* |( O. K5 y6 U持续更新,更多文章请见专栏和目录' z& Z& w9 z3 I$ y
4 p! i$ @$ M6 x( Y, x专栏:MATLAB科学绘图
. e$ n0 W$ Q% i* g
- r1 Z+ @& S* _; }MATLAB画图技巧与实例:目录
6 s+ f3 k' h, T8 k. v. e4 H1 \' [2 J/ d9 x
MATLAB画图技巧与实例(一):常用函数
8 _- t% R& v; F0 Q
% P0 m! W% j9 F; D+ Q: `& {8 r6 N2 C3 l! n
参考2 X* a3 L2 N* G: L; p9 ]3 |6 y' _; C
8 i" x" S# s4 ~$ U3 k& q# b! J
1 F3 t1 l+ O5 `* Y |