从本文开始,讲述使用MATLAB绘制等高线图,相关函数包括:" Z9 U: V6 n# j" I2 T
- contour-矩阵的等高线图
- contourf-填充的二维等高线图
- contourc-低级等高线图计算
- contour3-三维等高线图
- contourslice-在三维体切片平面中绘制等高线
- clabel-为等高线图添加高程标签
- fcontour-绘制等高线
$ s! m5 N( d' k9 d 本文讲述contour和contourf两个函数,用得最广泛,论文中经常能看到。+ ^0 e7 }8 v8 X/ l5 X
1 常用函数4 f4 C8 f) J |4 b" k6 F2 |/ A
+ N2 g- j9 O+ ^+ b7 K' O R
在介绍等高线函数前,先介绍几个常用函数。
% ]! ]! K/ Q4 H$ e* `. O1.1 linspace函数2 p4 ~; Y. t1 l. |
linspace函数用于生成线性等间距矢量。& B" ~. X; B( B7 I5 x& M
用法如下& }2 i0 H" r9 w# E2 l' ]& p
y = linspace(x1,x2)y = linspace(x1,x2,n)2 O7 {5 d, x' X4 Z8 c. j
用于在两点间均匀产生n个点,默认是100个点。
; G3 H0 L6 K' S, dy = linspace(0,pi,150);length(y)
% R' C8 [6 R z$ _2 l% _' j返回值为150。
1 O( u( a* O+ L/ D1.2 meshgrid函数
5 Z1 j! ]3 y ~) ]6 S) R( l等高线图的对象为矩阵,因此需要将向量转化为矩阵。% x- Y6 Q0 i+ u& j& o: C
可采用meshgrid函数。
3 }/ l+ w0 h) n+ H; t& B! D用法
, \3 ~' h& L' S5 [[X,Y] = meshgrid(x,y)[X,Y] = meshgrid(x)[X,Y,Z] = meshgrid(x,y,z)[X,Y,Z] = meshgrid(x)0 X3 T9 C$ J/ T
例如
% o, b4 @' j! Xclc %更多文章,www.52ocean.cn allclose ally = linspace(0,pi,4);Y = meshgrid(y);yY
! m6 T4 ?4 l$ E$ c运行结果为+ i* E" s; b4 K" _& h% U+ w
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, Z$ o ^' a+ I
2. contour和contourf函数4 T& `% y1 j1 H7 `
, v( e0 L- F! H# H8 f
2.1 用法
0 r# o5 i' D7 V. X. ycontourf(Z)contourf(X,Y,Z)contourf(___,levels)contourf(___,LineSpec)contourf(___,Name,Value)contourf(ax,___)M = contourf(___)[M,c] = contourf(___)
/ c/ n& F. r4 y0 F& W, ccontourf(Z) 创建一个包含矩阵 Z 的等值线的填充等高线图,其中 Z 包含 x-y 平面上的高度值。MATLAB® 会自动选择要显示的等高线。Z 的列和行索引分别是平面中的 x 和 y 坐标。
+ t" H* f; @7 lcontourf(X,Y,Z) 指定 Z 中各值的 x 和 y 坐标。( {7 u2 r6 g& G5 Z% \" g
contourf(___,levels) 将要显示的等高线指定为上述任一语法中的最后一个参数。将 levels 指定为标量值 n,以在 n 个自动选择的层级(高度)上显示等高线。要在某些特定高度绘制等高线,请将 levels 指定为单调递增值的向量。要在一个高度 (k) 绘制等高线,请将 levels 指定为二元素行向量 [k k]。
* f& x! z# o! t6 C; t3 p+ Gcontourf(___,LineSpec) 指定等高线的线型和颜色。5 c" C5 j5 d. B! G9 v
contourf(___,Name,Value) 使用一个或多个名称-值对组参数指定等高线图的其他选项。请在所有其他输入参数之后指定这些选项。有关属性列表,请参阅 Contour 属性。
) }8 W! @# o7 l7 Tcontourf(ax,___) 在目标坐标区中显示等高线图。将坐标区指定为上述任一语法中的第一个参数。
' D% l/ ^# Q# s, R" j+ m# [M = contourf(___) 返回等高线矩阵 M,其中包含每个层级的顶点的 (x, y) 坐标。# k% j1 k1 a" S( [ k
[M,c] = contourf(___) 返回等高线矩阵和等高线对象 c。显示等高线图后,使用 c 设置属性。[1][2] contour和contourf函数用法完全一致。# A% s/ v/ X4 f f- u
2.2 示例1
% Y4 C R t: h; C# S7 Q/ Rclc %更多文章,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 v( j; Q/ G; u
这里绘制 函数在 和 上的图像。
/ r2 \9 k& X6 \' r( N/ p! n) J左图为等高线图,只有线,颜色表示值的大小,黄色表示峰,蓝色表示谷。5 ^( W4 E7 ^3 {5 X, e7 m: j
右图为填充等高线图,色彩较为明艳,比较好看,因此用得比左图多。
) q- m- u+ j- u, K- y% Y2.3 示例2:改变等高线数目6 G# h5 @) k9 u, G
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 S, C% Y: |3 I7 ^9 s' U等高线数目是等高线图的重要参数,2.2中的图从最高点到最低点,默认为7个线条。
4 D3 n) a( L/ o$ y( H* O这里,数量增加到14。不建议数目太多,看起来感觉乱,Ps密集恐惧症简直要犯了,也不建议太少。5 i9 F: r2 ^2 ?# x. O& V# ], o# q
2.4 示例3:显示特定层级& B5 ?# H% f; L2 U8 {& n; 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, [-0.5 0.5])subplot(1,2,2)contourf(X, Y, Z, [-0.5 0.5])6 S5 g. B& H" H; X& Y
我们可以控制显示区间,例如这里只显示[-0.5 0.5]之间的数据,大于0.5位黄色,小于-0.5白色,深蓝色为中间值。& v6 n$ E k) z$ }" q
2.5 示例4:属性控制
. \0 n5 P1 A3 C在图形句柄中有很多参数可以设定,包括颜色、线型、线宽、标签值等等。
# D; S4 B" s; w; R7 ^- S( }: j. Kclc %更多文章,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')
' C6 U/ ]% Z' P/ ?' H如,为每一条等高线添加数值标签,这个用的很多。; U* {7 D* V( U( k- 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, '--','linewidth',2)subplot(1,2,2)contourf(X, Y, Z, 4,'-.','linewidth',2); V4 T* s4 j( M- \
也能改变线型和线宽。* @" C% W3 }+ g$ O2 a
2.6 示例5:不显示某些特定值或区域
; Z2 Z) ?5 S4 Jclc %更多文章,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)/ v& E6 r( n" [" }" N5 w) @
论文中经常遇到某些值、区域不想显示出来,留作空白。那么可以让这些区域的坐标或者值抠除即可,采用NaN赋值即可,如上图所示。
O5 o, H' c. P0 ~4 uNaN即not a number。
7 G3 Z8 i* ` X' x3 J2 b持续更新,更多文章请见专栏和目录
$ T. s5 v2 H* j6 `( V
H) O: S+ H. @专栏:MATLAB科学绘图
3 T0 F) o ]% z1 ?3 r
( ^8 R: p3 V/ {$ vMATLAB画图技巧与实例:目录6 s/ V/ X# s- D: U! u1 K
( F& t8 D6 A) H9 V
MATLAB画图技巧与实例(一):常用函数
! x" A7 m0 a6 ^' R, ]1 X& \ z2 x! t/ L0 T: o4 C& B
7 C; i5 S9 x* v F; ?4 v) `参考9 l* i% j/ I8 j4 w
! s" i- B0 Q; x# n
7 n( U0 O. a( S% e J2 G |