从本文开始,讲述使用MATLAB绘制等高线图,相关函数包括:
* J& y2 q9 X7 H C- contour-矩阵的等高线图
- contourf-填充的二维等高线图
- contourc-低级等高线图计算
- contour3-三维等高线图
- contourslice-在三维体切片平面中绘制等高线
- clabel-为等高线图添加高程标签
- fcontour-绘制等高线
3 v" w7 O% a+ {( L1 S( Z2 ^ 本文讲述contour和contourf两个函数,用得最广泛,论文中经常能看到。
' [6 P/ A: }7 L& d) W' U1 常用函数: M+ j9 t9 G7 D2 m% {0 ]# Q5 h
/ \1 v9 A! d* K- ^3 Q
在介绍等高线函数前,先介绍几个常用函数。+ A4 x# E! J/ ^! \1 D' M
1.1 linspace函数7 m& o5 C2 y! `8 i/ m
linspace函数用于生成线性等间距矢量。
. V$ e/ k# b' q8 H7 c# B: j用法如下
, o, ]4 L" t0 B' |' k2 _' Ay = linspace(x1,x2)y = linspace(x1,x2,n)
5 L7 Y+ {# m% {, \7 ], M用于在两点间均匀产生n个点,默认是100个点。' ?2 ]7 S: l9 B7 U; I. e _
y = linspace(0,pi,150);length(y)
$ Y3 R& \1 f* t: y9 @0 O8 C2 c返回值为150。
# ~8 b. p* Z% S {/ U& M5 ^: r0 }1.2 meshgrid函数
- _$ v$ v; v" f等高线图的对象为矩阵,因此需要将向量转化为矩阵。- V+ z6 L; g% ]4 K8 _3 Z
可采用meshgrid函数。) p( F1 g [6 d7 M) [- h
用法: T3 d, l% o8 u
[X,Y] = meshgrid(x,y)[X,Y] = meshgrid(x)[X,Y,Z] = meshgrid(x,y,z)[X,Y,Z] = meshgrid(x)5 F# k. a9 d$ G+ b9 P
例如0 Q1 t5 e! a, ^/ W! u
clc %更多文章,www.52ocean.cn allclose ally = linspace(0,pi,4);Y = meshgrid(y);yY( K& [$ s+ p) f+ G
运行结果为
- `7 @6 _: k' a& ]! K- \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" w$ r/ r& Q" {+ ]
2. contour和contourf函数
3 e a! f, g3 w/ t& _' {, u# r& O( w! f0 V6 }) J( ~$ d
2.1 用法
9 r3 O: e) z q2 L5 Q0 c) hcontourf(Z)contourf(X,Y,Z)contourf(___,levels)contourf(___,LineSpec)contourf(___,Name,Value)contourf(ax,___)M = contourf(___)[M,c] = contourf(___): b" ]0 n- X @! a
contourf(Z) 创建一个包含矩阵 Z 的等值线的填充等高线图,其中 Z 包含 x-y 平面上的高度值。MATLAB® 会自动选择要显示的等高线。Z 的列和行索引分别是平面中的 x 和 y 坐标。
E7 r! v5 q. Y: {contourf(X,Y,Z) 指定 Z 中各值的 x 和 y 坐标。" t$ ?' i7 J* }" x* v* \8 F3 Z3 R- Z
contourf(___,levels) 将要显示的等高线指定为上述任一语法中的最后一个参数。将 levels 指定为标量值 n,以在 n 个自动选择的层级(高度)上显示等高线。要在某些特定高度绘制等高线,请将 levels 指定为单调递增值的向量。要在一个高度 (k) 绘制等高线,请将 levels 指定为二元素行向量 [k k]。
5 W& P5 `8 p- ^/ X( T, gcontourf(___,LineSpec) 指定等高线的线型和颜色。( V% J: @+ e& F
contourf(___,Name,Value) 使用一个或多个名称-值对组参数指定等高线图的其他选项。请在所有其他输入参数之后指定这些选项。有关属性列表,请参阅 Contour 属性。- i* w0 g' M' x# _( c7 F, ~
contourf(ax,___) 在目标坐标区中显示等高线图。将坐标区指定为上述任一语法中的第一个参数。+ {: s w* }- B6 o$ P2 [
M = contourf(___) 返回等高线矩阵 M,其中包含每个层级的顶点的 (x, y) 坐标。
! t u% g! g' |) A[M,c] = contourf(___) 返回等高线矩阵和等高线对象 c。显示等高线图后,使用 c 设置属性。[1][2] contour和contourf函数用法完全一致。
3 x# c) _1 u2 [' L2 y2.2 示例17 G) l+ a* c: ]: Y- l: H# J
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)
9 N7 `3 i2 ~& Y. o2 Q这里绘制 函数在 和 上的图像。- s8 K: U# s( ?% s; Z3 J( W2 \
左图为等高线图,只有线,颜色表示值的大小,黄色表示峰,蓝色表示谷。; P; `. D h: `. q' R, ?, z
右图为填充等高线图,色彩较为明艳,比较好看,因此用得比左图多。" h4 X! c/ e" }8 B: y$ q# b
2.3 示例2:改变等高线数目
& _$ o. e/ H8 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, 14)subplot(1,2,2)contourf(X, Y, Z, 14)0 f: D" s5 A) ]! }
等高线数目是等高线图的重要参数,2.2中的图从最高点到最低点,默认为7个线条。
6 f7 d- [1 `* q b' l这里,数量增加到14。不建议数目太多,看起来感觉乱,Ps密集恐惧症简直要犯了,也不建议太少。2 |7 ~1 j" b s- Q; e3 \$ _
2.4 示例3:显示特定层级6 W) t" h3 m9 V. 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, [-0.5 0.5])subplot(1,2,2)contourf(X, Y, Z, [-0.5 0.5])- D% |. Z9 ]" H4 \
我们可以控制显示区间,例如这里只显示[-0.5 0.5]之间的数据,大于0.5位黄色,小于-0.5白色,深蓝色为中间值。6 h0 w6 ^2 {. Y" e, K: {
2.5 示例4:属性控制
5 p/ H: \1 x$ ?3 ~' n- q! p在图形句柄中有很多参数可以设定,包括颜色、线型、线宽、标签值等等。: ^5 x! c6 J( Q7 x' L
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')1 F4 \- M9 f0 y$ b0 j7 b3 L
如,为每一条等高线添加数值标签,这个用的很多。
* Z' M- U1 Y& o" f1 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, '--','linewidth',2)subplot(1,2,2)contourf(X, Y, Z, 4,'-.','linewidth',2)( t2 `+ S2 a- L% ^/ u4 E
也能改变线型和线宽。
# C% c5 c* Y& @2.6 示例5:不显示某些特定值或区域, E* V2 o4 z/ j" r* b2 F
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)
' E; L- t4 A7 `) _6 n& e/ J" ^, U论文中经常遇到某些值、区域不想显示出来,留作空白。那么可以让这些区域的坐标或者值抠除即可,采用NaN赋值即可,如上图所示。
2 ^+ n; G: U* [NaN即not a number。. o [( Y, C, r% s, R4 H) t4 a8 d$ c
持续更新,更多文章请见专栏和目录 g# ~+ ^" \+ V* r- r4 |, S# i
; E: q( ]2 A% ?, h* u9 d" K" A1 o( P专栏:MATLAB科学绘图
! g3 e! f9 z# }; p$ Y/ M- V5 D
MATLAB画图技巧与实例:目录
, ]8 U* G; y. D" U- V
! C' g: }3 d, R. x% uMATLAB画图技巧与实例(一):常用函数
6 Y' \/ ~! [5 q2 j. |# c! y0 d0 n" t% x- r# ]' }: m" G% L# v
# g: X$ g5 P6 A
参考
7 {9 {% m' ]5 V0 L% T: N; w8 e3 K( W
4 |7 D' ~/ z& S- k* N1 y5 |4 G: @- x( i
|