从本文开始,讲述使用MATLAB绘制等高线图,相关函数包括:& r i" ^( J7 b) E J
- contour-矩阵的等高线图
- contourf-填充的二维等高线图
- contourc-低级等高线图计算
- contour3-三维等高线图
- contourslice-在三维体切片平面中绘制等高线
- clabel-为等高线图添加高程标签
- fcontour-绘制等高线
4 P+ J0 ]& D# j. C 本文讲述contour和contourf两个函数,用得最广泛,论文中经常能看到。3 q: ^( e$ m' L
1 常用函数
6 i9 S; w% [7 G4 j$ z# x* ?: H0 |' E% L
在介绍等高线函数前,先介绍几个常用函数。- ~3 O2 U$ f0 A% [: e! b
1.1 linspace函数
0 i9 l: O* h7 ^, hlinspace函数用于生成线性等间距矢量。2 v& r* \2 R% ~5 K' F
用法如下: \' p2 t+ Z M- T
y = linspace(x1,x2)y = linspace(x1,x2,n)/ [5 O' L ^" S
用于在两点间均匀产生n个点,默认是100个点。
& \3 j7 j4 j2 n! uy = linspace(0,pi,150);length(y)/ R& v: l& L V% L: f* S
返回值为150。' x- p- B) I* A( }; \! L
1.2 meshgrid函数
0 R8 C/ B4 F6 P4 [等高线图的对象为矩阵,因此需要将向量转化为矩阵。
4 i+ J* t0 B6 Z! U可采用meshgrid函数。
, }: m: ]9 ?. O# z7 B0 _用法: n# J/ F9 T# G& o: q9 m, ~, Q |, m
[X,Y] = meshgrid(x,y)[X,Y] = meshgrid(x)[X,Y,Z] = meshgrid(x,y,z)[X,Y,Z] = meshgrid(x)8 G- m: a1 p) d9 N
例如
6 Z6 N( K: H$ _/ M3 yclc %更多文章,www.52ocean.cn allclose ally = linspace(0,pi,4);Y = meshgrid(y);yY$ ~2 G. o, B) L. G0 {+ w% e
运行结果为
1 ?9 @. A, M0 Wy = 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
" E h% E" P7 t: R/ H9 _2. contour和contourf函数
* j& v* ?/ \4 N' E/ N z4 C- |
' D3 M2 ~1 E7 ^9 l( r2.1 用法5 J$ N) F3 L7 I# ?% e1 J
contourf(Z)contourf(X,Y,Z)contourf(___,levels)contourf(___,LineSpec)contourf(___,Name,Value)contourf(ax,___)M = contourf(___)[M,c] = contourf(___)
/ ~0 L/ |& a, [contourf(Z) 创建一个包含矩阵 Z 的等值线的填充等高线图,其中 Z 包含 x-y 平面上的高度值。MATLAB® 会自动选择要显示的等高线。Z 的列和行索引分别是平面中的 x 和 y 坐标。& U; h7 C4 ^- B9 Z) t
contourf(X,Y,Z) 指定 Z 中各值的 x 和 y 坐标。3 e) p, j7 G( j0 i
contourf(___,levels) 将要显示的等高线指定为上述任一语法中的最后一个参数。将 levels 指定为标量值 n,以在 n 个自动选择的层级(高度)上显示等高线。要在某些特定高度绘制等高线,请将 levels 指定为单调递增值的向量。要在一个高度 (k) 绘制等高线,请将 levels 指定为二元素行向量 [k k]。" ~! f& n3 B; H' c' d+ C6 \
contourf(___,LineSpec) 指定等高线的线型和颜色。
$ G; o4 N5 K9 P! W' R0 ^" f" ncontourf(___,Name,Value) 使用一个或多个名称-值对组参数指定等高线图的其他选项。请在所有其他输入参数之后指定这些选项。有关属性列表,请参阅 Contour 属性。* {7 q# |: \+ h; ?3 f4 w
contourf(ax,___) 在目标坐标区中显示等高线图。将坐标区指定为上述任一语法中的第一个参数。8 D9 u$ {, h* D2 i
M = contourf(___) 返回等高线矩阵 M,其中包含每个层级的顶点的 (x, y) 坐标。 }, j" w9 m2 ?0 R5 y
[M,c] = contourf(___) 返回等高线矩阵和等高线对象 c。显示等高线图后,使用 c 设置属性。[1][2] contour和contourf函数用法完全一致。# V% h* h% q- r% F: Q
2.2 示例1 u$ V% o" w& r1 @/ D
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)
- b; _. m- E) I. W1 J这里绘制 函数在 和 上的图像。
9 s7 ^) {% b) U左图为等高线图,只有线,颜色表示值的大小,黄色表示峰,蓝色表示谷。7 V3 X* i8 L- {" T) L
右图为填充等高线图,色彩较为明艳,比较好看,因此用得比左图多。
$ z/ Z$ F$ J* K8 L0 ]2.3 示例2:改变等高线数目
; C+ d1 H* Z" \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)
n2 N/ N3 c! ]' e等高线数目是等高线图的重要参数,2.2中的图从最高点到最低点,默认为7个线条。
9 `8 @8 r- A* T5 Y) z这里,数量增加到14。不建议数目太多,看起来感觉乱,Ps密集恐惧症简直要犯了,也不建议太少。& U8 T; _9 i0 v& ], m' o7 |
2.4 示例3:显示特定层级
% E1 c; G5 v2 B; F( X8 X! Q6 Zclc %更多文章,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])( E1 i, f* ^6 g3 {( W2 A$ F
我们可以控制显示区间,例如这里只显示[-0.5 0.5]之间的数据,大于0.5位黄色,小于-0.5白色,深蓝色为中间值。
3 z9 {9 ? v/ @( R/ c. d" ?2.5 示例4:属性控制
9 r! {! h1 G: E7 V& N2 N在图形句柄中有很多参数可以设定,包括颜色、线型、线宽、标签值等等。- A: s4 K! R8 R! x5 O: b4 N: o& D
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')
5 c4 a- I+ i# b* v2 m如,为每一条等高线添加数值标签,这个用的很多。
- N2 Z8 i7 x, Dclc %更多文章,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)) n i9 a# p7 A2 v4 w$ y# S
也能改变线型和线宽。- G. C. j& C$ U/ B+ L# D
2.6 示例5:不显示某些特定值或区域8 o1 o- W" S2 F: g
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)
; `% [! z; R9 C8 U2 o: @论文中经常遇到某些值、区域不想显示出来,留作空白。那么可以让这些区域的坐标或者值抠除即可,采用NaN赋值即可,如上图所示。+ j k: F3 ]: F! E
NaN即not a number。
2 `4 J2 S6 r3 g- U& y r持续更新,更多文章请见专栏和目录/ ~/ v; G, M E
3 H$ d, t& I; G$ \, [- H
专栏:MATLAB科学绘图 f+ _" w6 f$ x! X( V- Z
, J. Y* O7 T3 R- P" x: Y7 UMATLAB画图技巧与实例:目录
' L9 L6 h$ V4 J% J5 w; u2 K) z9 X9 v- x' \# @
MATLAB画图技巧与实例(一):常用函数
! Y$ X& B! U+ t* j/ \
6 X! |. z- M( R$ a9 A+ o: q# x
( I' W0 c% z% E+ t1 ?参考( T; ]! \: X/ [! B- M6 ^3 I8 x! y
8 Z1 ?- O- l/ T9 k0 a2 s1 D
6 e/ S6 b, B+ q/ J2 {( a |