从本文开始,讲述使用MATLAB绘制等高线图,相关函数包括:
$ A& f- x( g" M6 H( O% O- contour-矩阵的等高线图
- contourf-填充的二维等高线图
- contourc-低级等高线图计算
- contour3-三维等高线图
- contourslice-在三维体切片平面中绘制等高线
- clabel-为等高线图添加高程标签
- fcontour-绘制等高线+ I) a, `! c6 R8 z9 T' }
本文讲述contour和contourf两个函数,用得最广泛,论文中经常能看到。$ U$ \! I' `: ?7 c+ H' r! k K
1 常用函数# I M3 o3 k4 l2 t p. {. \* [ E1 x
8 }% j& i4 L1 `8 c' a$ c/ C, k. R
在介绍等高线函数前,先介绍几个常用函数。0 c7 Z' \; [$ a! F% E T+ }& ]
1.1 linspace函数& y# Q9 j" k& m" e2 M h6 D
linspace函数用于生成线性等间距矢量。
7 \9 |8 a! l9 K* ?1 l) P$ V用法如下
% ~+ s# ^& A/ ^7 x# iy = linspace(x1,x2)y = linspace(x1,x2,n)8 L: n/ i& `- L/ {" K
用于在两点间均匀产生n个点,默认是100个点。2 C! k% J z0 y+ I
y = linspace(0,pi,150);length(y)0 t2 k4 W: ~; \2 a0 U. k: Y0 O- [
返回值为150。* O+ f- l+ g7 I5 }( m
1.2 meshgrid函数
4 O0 j9 b1 C# B/ G) y等高线图的对象为矩阵,因此需要将向量转化为矩阵。5 ]& C1 |( x7 H* g' p8 ?9 [: L8 H
可采用meshgrid函数。 v; f- e/ V# O2 [+ [ C/ c2 d
用法; X9 n+ Y8 n6 t, t( ~7 e
[X,Y] = meshgrid(x,y)[X,Y] = meshgrid(x)[X,Y,Z] = meshgrid(x,y,z)[X,Y,Z] = meshgrid(x)- @/ e% h- e7 }5 z* R
例如6 |: e4 ? P2 |/ k' Z
clc %更多文章,www.52ocean.cn allclose ally = linspace(0,pi,4);Y = meshgrid(y);yY% b6 t i: E$ H" j
运行结果为, e7 A3 c8 {" G" A8 W/ Y
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* h$ w) `# ?( d
2. contour和contourf函数
* s- l) s Y3 d0 l5 i! W% Z j, V5 ~' H% O
2.1 用法: s V+ X; e: i( k$ L0 A, d
contourf(Z)contourf(X,Y,Z)contourf(___,levels)contourf(___,LineSpec)contourf(___,Name,Value)contourf(ax,___)M = contourf(___)[M,c] = contourf(___)3 g) ^, e. P: i, T3 h
contourf(Z) 创建一个包含矩阵 Z 的等值线的填充等高线图,其中 Z 包含 x-y 平面上的高度值。MATLAB® 会自动选择要显示的等高线。Z 的列和行索引分别是平面中的 x 和 y 坐标。
4 N- w5 T1 G3 B3 \- O% l4 `/ G- z# Xcontourf(X,Y,Z) 指定 Z 中各值的 x 和 y 坐标。) U: X: r6 P1 b! D* q1 r
contourf(___,levels) 将要显示的等高线指定为上述任一语法中的最后一个参数。将 levels 指定为标量值 n,以在 n 个自动选择的层级(高度)上显示等高线。要在某些特定高度绘制等高线,请将 levels 指定为单调递增值的向量。要在一个高度 (k) 绘制等高线,请将 levels 指定为二元素行向量 [k k]。
" C; u: S& a; A. u; ~ C8 Hcontourf(___,LineSpec) 指定等高线的线型和颜色。
$ s8 K( p$ J: D& R7 }8 D* Ucontourf(___,Name,Value) 使用一个或多个名称-值对组参数指定等高线图的其他选项。请在所有其他输入参数之后指定这些选项。有关属性列表,请参阅 Contour 属性。- p+ B+ x* _+ a1 W- n3 H; Y
contourf(ax,___) 在目标坐标区中显示等高线图。将坐标区指定为上述任一语法中的第一个参数。
. T" a; k! C$ y9 T, fM = contourf(___) 返回等高线矩阵 M,其中包含每个层级的顶点的 (x, y) 坐标。1 z$ Z/ m: b6 t, _- w
[M,c] = contourf(___) 返回等高线矩阵和等高线对象 c。显示等高线图后,使用 c 设置属性。[1][2] contour和contourf函数用法完全一致。
, N# }; }9 V, }# y# v% q* X2.2 示例1
& }1 c8 t7 E3 m: w1 ` uclc %更多文章,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)7 D7 C/ u- ~8 @8 a! W/ k
这里绘制 函数在 和 上的图像。3 I, [; D: L" x' }/ M7 W
左图为等高线图,只有线,颜色表示值的大小,黄色表示峰,蓝色表示谷。
* @; ?3 t5 W' ?" ^; N! P4 D- F右图为填充等高线图,色彩较为明艳,比较好看,因此用得比左图多。
0 k6 d* Z' ?8 B2.3 示例2:改变等高线数目
5 S' [0 r1 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)2 S6 I% W% O5 |: O% Q
等高线数目是等高线图的重要参数,2.2中的图从最高点到最低点,默认为7个线条。. y% p' b; b8 {8 l* \
这里,数量增加到14。不建议数目太多,看起来感觉乱,Ps密集恐惧症简直要犯了,也不建议太少。7 s& {5 ~ G* c& v5 ~1 D( c
2.4 示例3:显示特定层级
1 }. N$ ^2 V$ l) W0 O1 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, [-0.5 0.5])subplot(1,2,2)contourf(X, Y, Z, [-0.5 0.5])
& o- d) o3 b8 i9 @9 Z7 M5 d4 f我们可以控制显示区间,例如这里只显示[-0.5 0.5]之间的数据,大于0.5位黄色,小于-0.5白色,深蓝色为中间值。2 l( E2 L* N! d6 ], G
2.5 示例4:属性控制
6 K: Q3 }- D+ z: `7 M在图形句柄中有很多参数可以设定,包括颜色、线型、线宽、标签值等等。5 u; p6 J6 Y- r8 }& Y- 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, 4, 'ShowText','on')subplot(1,2,2)contourf(X, Y, Z, 4,'ShowText','on') C! ?7 {& i7 \9 R* O" }" O( O
如,为每一条等高线添加数值标签,这个用的很多。
& v$ S8 Q; w& _! y0 Y$ Yclc %更多文章,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)9 ]; I6 \' W, A! g, }( n
也能改变线型和线宽。& N- S2 M2 t z" U7 ~" d, v1 J
2.6 示例5:不显示某些特定值或区域, ` H# Q# F- u$ e) a3 w7 e
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)
3 M( L3 r5 ~2 R! w论文中经常遇到某些值、区域不想显示出来,留作空白。那么可以让这些区域的坐标或者值抠除即可,采用NaN赋值即可,如上图所示。
: U0 d; S7 c5 G; U4 ^ _NaN即not a number。0 a8 f6 @, ^7 s; O6 S2 q3 F
持续更新,更多文章请见专栏和目录
; B- I* j, i1 `3 u3 [3 _; s& D# Q! m2 s4 C. ^& |* H
专栏:MATLAB科学绘图
4 ?! h/ j" C' a. w0 P% j
8 W- [: ]* [! RMATLAB画图技巧与实例:目录/ Z+ E4 r8 M+ ~+ Y
) W1 A( F! W) L! @7 A. F
MATLAB画图技巧与实例(一):常用函数% Z" I8 J8 @; m1 {& F2 m# ]& Z
Y. s( V* T( ~& r- ^9 Z0 `" {) T* a# a! G d6 z/ Q% w
参考
% o; @% S& z1 k5 Q% `6 e
: \$ ]4 r8 r* E, p0 t x' x2 ?0 ~7 c6 I# u
|