从本文开始,讲述使用MATLAB绘制等高线图,相关函数包括:
- t9 M+ L+ ]( |+ U, o8 b( J: B- contour-矩阵的等高线图
- contourf-填充的二维等高线图
- contourc-低级等高线图计算
- contour3-三维等高线图
- contourslice-在三维体切片平面中绘制等高线
- clabel-为等高线图添加高程标签
- fcontour-绘制等高线/ i7 L" R+ q9 }, h% x( W; P! [
本文讲述contour和contourf两个函数,用得最广泛,论文中经常能看到。* b3 X# G2 u. R
1 常用函数) W- Z T. T( j$ D O4 [( r
" z$ [7 s- I4 p+ ^; A, F) q& N9 b
在介绍等高线函数前,先介绍几个常用函数。% I0 l4 C' U: C o7 q9 ^
1.1 linspace函数% y( r3 b1 E, C
linspace函数用于生成线性等间距矢量。1 R/ n/ p3 X# V
用法如下" B: f' W6 x5 y; I1 T0 c; t
y = linspace(x1,x2)y = linspace(x1,x2,n)) G8 q% ^: J: p$ X
用于在两点间均匀产生n个点,默认是100个点。' w! f% c9 n7 m4 ^0 Y! e! H
y = linspace(0,pi,150);length(y): e- [& l) D% m/ A# m+ P, v. y
返回值为150。
9 n9 F1 P& d+ I& @1.2 meshgrid函数
/ O" f$ E: d3 _' C9 ?, S6 H等高线图的对象为矩阵,因此需要将向量转化为矩阵。
! n& m7 D `' @9 ?; i可采用meshgrid函数。/ E, E3 S, d, Y7 q0 W! h( `# q
用法
$ S6 ^7 K! Q% V[X,Y] = meshgrid(x,y)[X,Y] = meshgrid(x)[X,Y,Z] = meshgrid(x,y,z)[X,Y,Z] = meshgrid(x)2 A- D6 O1 W* t& E/ `2 A6 [3 ]
例如
8 q ` H# t3 v3 _0 n, ~clc %更多文章,www.52ocean.cn allclose ally = linspace(0,pi,4);Y = meshgrid(y);yY
+ N+ ?/ }/ U' p$ z8 E运行结果为
1 o. n% L6 D9 E- M0 N8 Z$ |5 Dy = 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
( D$ J5 O# M4 H, Q( L# e2. contour和contourf函数5 i$ J2 b& J6 f4 u* ~
, z. ?8 |/ A6 y5 }4 r. w( p
2.1 用法$ n* ?9 s% y9 [& [
contourf(Z)contourf(X,Y,Z)contourf(___,levels)contourf(___,LineSpec)contourf(___,Name,Value)contourf(ax,___)M = contourf(___)[M,c] = contourf(___)' v: _/ m+ ^7 \' b
contourf(Z) 创建一个包含矩阵 Z 的等值线的填充等高线图,其中 Z 包含 x-y 平面上的高度值。MATLAB® 会自动选择要显示的等高线。Z 的列和行索引分别是平面中的 x 和 y 坐标。
1 H0 T( h' w. C; R* Tcontourf(X,Y,Z) 指定 Z 中各值的 x 和 y 坐标。
2 M$ ]) J' }. ~. q2 w) m# Gcontourf(___,levels) 将要显示的等高线指定为上述任一语法中的最后一个参数。将 levels 指定为标量值 n,以在 n 个自动选择的层级(高度)上显示等高线。要在某些特定高度绘制等高线,请将 levels 指定为单调递增值的向量。要在一个高度 (k) 绘制等高线,请将 levels 指定为二元素行向量 [k k]。4 D1 q9 u1 j# K
contourf(___,LineSpec) 指定等高线的线型和颜色。" ~2 p j4 R0 O" |3 S5 t
contourf(___,Name,Value) 使用一个或多个名称-值对组参数指定等高线图的其他选项。请在所有其他输入参数之后指定这些选项。有关属性列表,请参阅 Contour 属性。1 U4 q2 ]4 y; \# U8 P( @
contourf(ax,___) 在目标坐标区中显示等高线图。将坐标区指定为上述任一语法中的第一个参数。
: @! r o7 c/ n( R' DM = contourf(___) 返回等高线矩阵 M,其中包含每个层级的顶点的 (x, y) 坐标。
7 y- ?% B- L( U" y! q; C[M,c] = contourf(___) 返回等高线矩阵和等高线对象 c。显示等高线图后,使用 c 设置属性。[1][2] contour和contourf函数用法完全一致。
5 Z# g; d- b# p v4 V) ?( s1 |2.2 示例14 h( T( L0 U& ~
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)2 ?# G. r' Q/ Q s: Q
这里绘制 函数在 和 上的图像。9 X5 c/ X4 ^8 H9 M: U: Y# s1 o
左图为等高线图,只有线,颜色表示值的大小,黄色表示峰,蓝色表示谷。
# u/ ?" M ?% E1 x0 n右图为填充等高线图,色彩较为明艳,比较好看,因此用得比左图多。
& \/ {# M' u- |2 ?1 }/ l2.3 示例2:改变等高线数目
2 J# ?7 o C4 g9 y8 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, 14)subplot(1,2,2)contourf(X, Y, Z, 14)) b- I7 L5 O/ [; j
等高线数目是等高线图的重要参数,2.2中的图从最高点到最低点,默认为7个线条。
3 ^) v/ l% r! `; H0 N, ~' e这里,数量增加到14。不建议数目太多,看起来感觉乱,Ps密集恐惧症简直要犯了,也不建议太少。1 H1 y0 |- k% G* A% k. i) e. U q
2.4 示例3:显示特定层级
, }4 T* g E5 o( b4 u9 |5 I$ iclc %更多文章,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 G) w8 z% R v# t" L$ y我们可以控制显示区间,例如这里只显示[-0.5 0.5]之间的数据,大于0.5位黄色,小于-0.5白色,深蓝色为中间值。
2 F* |, V: t+ d$ [ H, ^0 j2.5 示例4:属性控制
) m, j6 e1 `+ K% z/ w& W在图形句柄中有很多参数可以设定,包括颜色、线型、线宽、标签值等等。
& |+ A. x9 Z# @; n3 M, G4 ?" qclc %更多文章,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 m+ B7 K U: o2 h! o6 B4 d" D
如,为每一条等高线添加数值标签,这个用的很多。
- G" A& w3 y& O5 ]4 \3 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, '--','linewidth',2)subplot(1,2,2)contourf(X, Y, Z, 4,'-.','linewidth',2)5 W8 U8 a+ I0 d- y6 v
也能改变线型和线宽。
8 H& W3 p1 K5 j" s) S2 c0 C2.6 示例5:不显示某些特定值或区域
6 J& o0 V; W7 z Dclc %更多文章,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)$ s% o3 p; w( q+ A
论文中经常遇到某些值、区域不想显示出来,留作空白。那么可以让这些区域的坐标或者值抠除即可,采用NaN赋值即可,如上图所示。! Y4 f- ?- W# N' o5 b5 N
NaN即not a number。
Z. a, C( K4 R5 z; k持续更新,更多文章请见专栏和目录# S" U% j' E. N/ s3 s
- j' q7 M! ~9 T专栏:MATLAB科学绘图
c: T$ v( n) Z$ t1 H* A
: ~8 l& p' k) Y- l- x* O, f. s% F, M6 PMATLAB画图技巧与实例:目录
6 Y1 ^; w, K- v% O6 m8 _+ P1 I' E# c1 h3 }# l
MATLAB画图技巧与实例(一):常用函数( B& H7 O$ {9 n
4 M' S( E2 [; i- u
2 N, k) p2 Y# A% ?: E- v9 W4 L! s
参考
& E, G0 S6 V! p' i- l" L; t% I7 Z7 c* p" b+ c* z! i& t( g
7 W2 a3 C s! z8 k- V |