从本文开始,讲述使用MATLAB绘制等高线图,相关函数包括:
% Z; d4 J/ X- ]5 c; M- contour-矩阵的等高线图
- contourf-填充的二维等高线图
- contourc-低级等高线图计算
- contour3-三维等高线图
- contourslice-在三维体切片平面中绘制等高线
- clabel-为等高线图添加高程标签
- fcontour-绘制等高线, P: _ {, M( R- ?7 F, ?
本文讲述contour和contourf两个函数,用得最广泛,论文中经常能看到。- O: F+ w* a5 d; E4 l/ \0 E
1 常用函数
- [* @# S! U( k; u* f3 a# e) b$ h+ ~7 d4 p1 M: t
在介绍等高线函数前,先介绍几个常用函数。/ N! o& ?6 \) i3 W( ^
1.1 linspace函数8 _+ G, L4 r5 z0 H# Q5 P
linspace函数用于生成线性等间距矢量。" I; H6 W- Q+ @ ] k0 \9 B
用法如下# b e: @9 X8 h; r
y = linspace(x1,x2)y = linspace(x1,x2,n)! i1 L7 ]4 |( l& b. N
用于在两点间均匀产生n个点,默认是100个点。( F# S# J) @2 i+ W! x: P
y = linspace(0,pi,150);length(y)5 [9 K- d% J ?% g; g, ]8 D
返回值为150。+ A& U( }1 c4 U3 v+ T( N r( G
1.2 meshgrid函数
" g0 W5 j9 o- i. U, c) W. H! {等高线图的对象为矩阵,因此需要将向量转化为矩阵。
* ^' U; x& d1 m3 @6 S, \) U可采用meshgrid函数。 b% b7 X. o- s6 f2 O7 E3 n
用法! I, N) z5 j: {) I
[X,Y] = meshgrid(x,y)[X,Y] = meshgrid(x)[X,Y,Z] = meshgrid(x,y,z)[X,Y,Z] = meshgrid(x)
: t3 O1 g; O8 K例如
( @7 P, ]: j, D3 A! Pclc %更多文章,www.52ocean.cn allclose ally = linspace(0,pi,4);Y = meshgrid(y);yY4 D+ Q. L5 w4 S* M
运行结果为& \. j5 j4 m% I% N. u1 M- o
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
" B0 h: |( c3 y" j" D" v2. contour和contourf函数
, ^3 W- y5 g0 R
( H3 g- y ^& k- a* r! |. J2.1 用法
) j: p/ D' {% u# dcontourf(Z)contourf(X,Y,Z)contourf(___,levels)contourf(___,LineSpec)contourf(___,Name,Value)contourf(ax,___)M = contourf(___)[M,c] = contourf(___)5 m o3 L. R1 k! Z8 [) P' X( C
contourf(Z) 创建一个包含矩阵 Z 的等值线的填充等高线图,其中 Z 包含 x-y 平面上的高度值。MATLAB® 会自动选择要显示的等高线。Z 的列和行索引分别是平面中的 x 和 y 坐标。/ U" y% q: K& y. j1 y" k3 ^
contourf(X,Y,Z) 指定 Z 中各值的 x 和 y 坐标。
6 x* e' z0 W1 A+ q! u8 [2 }contourf(___,levels) 将要显示的等高线指定为上述任一语法中的最后一个参数。将 levels 指定为标量值 n,以在 n 个自动选择的层级(高度)上显示等高线。要在某些特定高度绘制等高线,请将 levels 指定为单调递增值的向量。要在一个高度 (k) 绘制等高线,请将 levels 指定为二元素行向量 [k k]。
1 t4 C5 N, y3 [& l. n: a) @2 Mcontourf(___,LineSpec) 指定等高线的线型和颜色。
! u* K# F$ `. \! gcontourf(___,Name,Value) 使用一个或多个名称-值对组参数指定等高线图的其他选项。请在所有其他输入参数之后指定这些选项。有关属性列表,请参阅 Contour 属性。
6 k' {# i2 e. @% I& w* L3 |4 s6 ^contourf(ax,___) 在目标坐标区中显示等高线图。将坐标区指定为上述任一语法中的第一个参数。. j! H1 u0 `% ]+ d' \' q$ U; D
M = contourf(___) 返回等高线矩阵 M,其中包含每个层级的顶点的 (x, y) 坐标。: \4 B* N8 U* {+ Y1 p- m$ O5 m! r+ f
[M,c] = contourf(___) 返回等高线矩阵和等高线对象 c。显示等高线图后,使用 c 设置属性。[1][2] contour和contourf函数用法完全一致。4 ^6 G. Q: E% N3 `' I W
2.2 示例1
6 w f0 X/ \+ C: i1 G( O1 O0 x: o' gclc %更多文章,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)1 S" ^/ x9 W% l" M s6 n6 Y
这里绘制 函数在 和 上的图像。. V4 s9 Y, T0 e
左图为等高线图,只有线,颜色表示值的大小,黄色表示峰,蓝色表示谷。' z% L7 k; q0 M5 w" _% O
右图为填充等高线图,色彩较为明艳,比较好看,因此用得比左图多。
& U( y+ m4 k4 I2.3 示例2:改变等高线数目6 z) O! a, ]8 r) i. O% X- d. {! K
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)
/ e1 b: E) z V0 t. e) T等高线数目是等高线图的重要参数,2.2中的图从最高点到最低点,默认为7个线条。
3 ~ [8 q* L D: t4 ~- x) E1 A这里,数量增加到14。不建议数目太多,看起来感觉乱,Ps密集恐惧症简直要犯了,也不建议太少。, X4 o# F1 ~( J: n9 Q- x
2.4 示例3:显示特定层级9 Z; u) ]" Q& [; M
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])& F% @% c5 t* s* `1 z4 C, h8 C
我们可以控制显示区间,例如这里只显示[-0.5 0.5]之间的数据,大于0.5位黄色,小于-0.5白色,深蓝色为中间值。- S- r8 i! C6 T$ f& q* [% K* i
2.5 示例4:属性控制
6 u% L6 F6 S5 y8 Y. x在图形句柄中有很多参数可以设定,包括颜色、线型、线宽、标签值等等。
- k' j% A, Q+ A8 j9 B8 p4 Bclc %更多文章,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')3 V9 x, y4 r5 y4 D# \: U& C
如,为每一条等高线添加数值标签,这个用的很多。
: m+ F$ y& ^, O2 p& Fclc %更多文章,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)
( M3 r% W* M! v, Q也能改变线型和线宽。0 X0 C! ]. r9 i% i2 Q9 r6 }
2.6 示例5:不显示某些特定值或区域
* [7 R" B& h* u5 Q. k) f; Vclc %更多文章,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)
' _; p) E+ Z& @' s论文中经常遇到某些值、区域不想显示出来,留作空白。那么可以让这些区域的坐标或者值抠除即可,采用NaN赋值即可,如上图所示。
2 i* _1 x0 D; ENaN即not a number。! x( m6 ~2 u/ c7 {1 E9 P
持续更新,更多文章请见专栏和目录1 e9 _" S! x+ Q/ ]
+ r) g% e2 b$ {) l. [
专栏:MATLAB科学绘图
) u9 M( B" f, F5 e- G# N& {1 |) u) a; F- ?9 o3 b
MATLAB画图技巧与实例:目录
: A) q$ j9 ], ], L6 l* G' Q. e! d, i L1 h. i5 m3 `& g; O1 r
MATLAB画图技巧与实例(一):常用函数& `# j, y) Z: O- M
; g3 p# c. N- x# g
8 t, a2 U$ y" D, B! a7 Z
参考
4 \8 s( d/ e. U) G3 ]
1 ~9 [, Y! v" [0 Z$ ^3 v
! i8 h/ N- z5 V3 f' m& E |