从本文开始,讲述使用MATLAB绘制等高线图,相关函数包括:
% S2 Q- F, N" x$ m, D* P6 ]% T) t; H* \- contour-矩阵的等高线图
- contourf-填充的二维等高线图
- contourc-低级等高线图计算
- contour3-三维等高线图
- contourslice-在三维体切片平面中绘制等高线
- clabel-为等高线图添加高程标签
- fcontour-绘制等高线
- ]: d7 A8 u0 J4 E& h9 E 本文讲述contour和contourf两个函数,用得最广泛,论文中经常能看到。
- b. @1 S& r N% p; d* d1 常用函数
O4 f$ W% x$ T% L2 j
3 j( S0 T$ C/ s# |; e' h. z在介绍等高线函数前,先介绍几个常用函数。
( m7 X& J0 P" |) ^1.1 linspace函数
4 }: w, A+ Z# `6 d' V6 g5 hlinspace函数用于生成线性等间距矢量。# n; y& C3 W( {* _
用法如下
$ D( A9 ? I! Q$ p& U7 P1 Fy = linspace(x1,x2)y = linspace(x1,x2,n)
g/ i: o$ W- m3 O" j9 ?" T/ y用于在两点间均匀产生n个点,默认是100个点。
2 t1 ? }& R. jy = linspace(0,pi,150);length(y)& c5 b( @0 ~% s, o" b
返回值为150。
: ^3 K. ^2 _; C! q! e9 M) X; n$ `1.2 meshgrid函数: u1 e2 A% U! m1 o
等高线图的对象为矩阵,因此需要将向量转化为矩阵。
$ _& C: y7 s- ], W可采用meshgrid函数。( \, _! V4 }" y
用法; \1 P3 ~5 C* d) @
[X,Y] = meshgrid(x,y)[X,Y] = meshgrid(x)[X,Y,Z] = meshgrid(x,y,z)[X,Y,Z] = meshgrid(x)
+ F3 l3 [; J2 l. Z' q! C例如
1 |) T# k# N, K5 k# Uclc %更多文章,www.52ocean.cn allclose ally = linspace(0,pi,4);Y = meshgrid(y);yY4 c; k/ y" B% o7 w
运行结果为
7 }% ? i8 O0 fy = 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.14164 c% X. g9 J8 D( U& d, ~
2. contour和contourf函数
7 }8 T' S3 w& Y8 [* a
- G* E2 y% F5 `3 g. W2.1 用法/ N3 j r. u# O+ e( _
contourf(Z)contourf(X,Y,Z)contourf(___,levels)contourf(___,LineSpec)contourf(___,Name,Value)contourf(ax,___)M = contourf(___)[M,c] = contourf(___)! S/ k' y3 p1 i7 @
contourf(Z) 创建一个包含矩阵 Z 的等值线的填充等高线图,其中 Z 包含 x-y 平面上的高度值。MATLAB® 会自动选择要显示的等高线。Z 的列和行索引分别是平面中的 x 和 y 坐标。
& N: n3 h) U' d% D! `contourf(X,Y,Z) 指定 Z 中各值的 x 和 y 坐标。0 X+ z5 m% @/ n1 L4 ?. O
contourf(___,levels) 将要显示的等高线指定为上述任一语法中的最后一个参数。将 levels 指定为标量值 n,以在 n 个自动选择的层级(高度)上显示等高线。要在某些特定高度绘制等高线,请将 levels 指定为单调递增值的向量。要在一个高度 (k) 绘制等高线,请将 levels 指定为二元素行向量 [k k]。, V& ^6 {+ ]: K& g- [
contourf(___,LineSpec) 指定等高线的线型和颜色。
/ J/ x8 q+ P& H3 F4 J: scontourf(___,Name,Value) 使用一个或多个名称-值对组参数指定等高线图的其他选项。请在所有其他输入参数之后指定这些选项。有关属性列表,请参阅 Contour 属性。( ?! O" _3 p9 A7 N' A
contourf(ax,___) 在目标坐标区中显示等高线图。将坐标区指定为上述任一语法中的第一个参数。) _' Q7 n9 ]. D6 T; v" y, e
M = contourf(___) 返回等高线矩阵 M,其中包含每个层级的顶点的 (x, y) 坐标。
; ^: H: f; X$ _ a( L[M,c] = contourf(___) 返回等高线矩阵和等高线对象 c。显示等高线图后,使用 c 设置属性。[1][2] contour和contourf函数用法完全一致。
, @6 ~" j# v4 Y( ]% q6 w+ }2.2 示例12 m7 ~4 N; [7 N- F2 A, Y
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)
$ t+ X6 [. z! D这里绘制 函数在 和 上的图像。1 J+ ?2 ?* x M o$ M
左图为等高线图,只有线,颜色表示值的大小,黄色表示峰,蓝色表示谷。8 X( j0 v9 a& c% B9 P5 V. M
右图为填充等高线图,色彩较为明艳,比较好看,因此用得比左图多。$ q0 y2 Q* S( [& C- M' Y" U
2.3 示例2:改变等高线数目8 v% t2 R' W" S
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)
+ K s9 t8 E2 S( K( r等高线数目是等高线图的重要参数,2.2中的图从最高点到最低点,默认为7个线条。
; @/ A' h \$ C! ^2 G这里,数量增加到14。不建议数目太多,看起来感觉乱,Ps密集恐惧症简直要犯了,也不建议太少。9 Y/ E3 ^$ m* B0 V
2.4 示例3:显示特定层级
! J; C6 M. d2 z# F+ ^; |0 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, [-0.5 0.5])subplot(1,2,2)contourf(X, Y, Z, [-0.5 0.5])
2 K b# o! Z* |% m+ G* a) T* w我们可以控制显示区间,例如这里只显示[-0.5 0.5]之间的数据,大于0.5位黄色,小于-0.5白色,深蓝色为中间值。
2 X) P: {3 c% O, }0 z: K; \2 `2.5 示例4:属性控制
7 H. F8 B# r* N( d) A; d在图形句柄中有很多参数可以设定,包括颜色、线型、线宽、标签值等等。 Z+ B9 U6 S, m: v! z4 @) G9 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')
, u3 P0 A: k" {) m: `& q4 u如,为每一条等高线添加数值标签,这个用的很多。6 [7 a K' ^. r4 b1 P
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)5 J7 Y3 y X, C6 O G3 ]7 h
也能改变线型和线宽。
3 _1 O2 _+ b4 O0 P7 b+ P6 o2.6 示例5:不显示某些特定值或区域
: O* r+ \1 P2 Z% N3 Fclc %更多文章,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) o9 U7 C/ A" I2 J2 I# N
论文中经常遇到某些值、区域不想显示出来,留作空白。那么可以让这些区域的坐标或者值抠除即可,采用NaN赋值即可,如上图所示。' C9 d% z+ |: F) u
NaN即not a number。
% N1 u! A" K; W6 p持续更新,更多文章请见专栏和目录
7 Z c6 ]$ \6 _: ~6 l
" ^4 P2 e% k% Y. M) t专栏:MATLAB科学绘图
* W7 ^6 C% l, Z4 }. w# f) i$ C T9 |- V+ V! I1 f7 S# M
MATLAB画图技巧与实例:目录
# E1 s g# L) x4 f% K9 a1 t- T; o- O
MATLAB画图技巧与实例(一):常用函数
. C3 e# X, z8 y4 Z3 z# J3 E* l X8 H; O- z8 Y, \ x1 }3 U, a
, t8 `" i" X" G, U- J
参考
8 N& o+ i4 j; B8 G4 i
: }. g) \# J1 H) X, j( R3 @
" N) k* }9 p) p$ U E5 J |