从本文开始,讲述使用MATLAB绘制等高线图,相关函数包括:
9 I X; x5 z- P- contour-矩阵的等高线图
- contourf-填充的二维等高线图
- contourc-低级等高线图计算
- contour3-三维等高线图
- contourslice-在三维体切片平面中绘制等高线
- clabel-为等高线图添加高程标签
- fcontour-绘制等高线
7 e- M+ p$ z6 n) v7 h 本文讲述contour和contourf两个函数,用得最广泛,论文中经常能看到。- n( l0 _ V* r5 d' T
1 常用函数3 _) | l3 _7 _/ B1 A% K
- \6 x: N, G8 S& s5 H% A# B( ? K在介绍等高线函数前,先介绍几个常用函数。3 G5 y# c* f: w( F. t3 Z! ]
1.1 linspace函数
; B+ q9 V+ t/ a4 Z( `linspace函数用于生成线性等间距矢量。$ d5 M D* P& p' V; D
用法如下
& t& s3 X) x6 ly = linspace(x1,x2)y = linspace(x1,x2,n). r5 k! ^0 w. |2 |$ Q6 a
用于在两点间均匀产生n个点,默认是100个点。$ o, O; m) W7 S
y = linspace(0,pi,150);length(y)5 ?, |+ d2 \! i! q3 I8 L
返回值为150。
4 R( h1 b$ K- I- }1 j. Z) j, f1.2 meshgrid函数; ~6 p C3 K. W6 b% s
等高线图的对象为矩阵,因此需要将向量转化为矩阵。
0 N5 A; P: v, x; [, H9 I可采用meshgrid函数。+ s# o7 u: ~- F0 `% r) f
用法) ?: }4 v/ ]. B, w
[X,Y] = meshgrid(x,y)[X,Y] = meshgrid(x)[X,Y,Z] = meshgrid(x,y,z)[X,Y,Z] = meshgrid(x)
! f" ~" F0 K# G" u4 o% o例如
) ~8 E W, Y7 Fclc %更多文章,www.52ocean.cn allclose ally = linspace(0,pi,4);Y = meshgrid(y);yY( p4 S Q' ~. `3 x/ }- j1 ~
运行结果为 H! h6 C! ] ?) L% R" G! A, x% k( c
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+ R7 i- C3 |4 U* q
2. contour和contourf函数
) r" O& `- y. ?, O0 _$ e' z6 k. [, N7 i5 u. U) W, ^) g4 n
2.1 用法
) Q9 K# Y. L" x( t( Econtourf(Z)contourf(X,Y,Z)contourf(___,levels)contourf(___,LineSpec)contourf(___,Name,Value)contourf(ax,___)M = contourf(___)[M,c] = contourf(___)
5 c* S" |; C* o" ucontourf(Z) 创建一个包含矩阵 Z 的等值线的填充等高线图,其中 Z 包含 x-y 平面上的高度值。MATLAB® 会自动选择要显示的等高线。Z 的列和行索引分别是平面中的 x 和 y 坐标。
2 l: p/ P* X; Ncontourf(X,Y,Z) 指定 Z 中各值的 x 和 y 坐标。
, O+ S" W0 m1 n" o$ m' }contourf(___,levels) 将要显示的等高线指定为上述任一语法中的最后一个参数。将 levels 指定为标量值 n,以在 n 个自动选择的层级(高度)上显示等高线。要在某些特定高度绘制等高线,请将 levels 指定为单调递增值的向量。要在一个高度 (k) 绘制等高线,请将 levels 指定为二元素行向量 [k k]。% R% A! }8 M# L+ s1 \/ b% s
contourf(___,LineSpec) 指定等高线的线型和颜色。7 f; W R: w4 E* u1 }
contourf(___,Name,Value) 使用一个或多个名称-值对组参数指定等高线图的其他选项。请在所有其他输入参数之后指定这些选项。有关属性列表,请参阅 Contour 属性。
. k; L2 C& e9 O3 m0 z% z4 \contourf(ax,___) 在目标坐标区中显示等高线图。将坐标区指定为上述任一语法中的第一个参数。& [1 ~/ Y$ b5 M! l* r9 u r
M = contourf(___) 返回等高线矩阵 M,其中包含每个层级的顶点的 (x, y) 坐标。% {' E- D* _( c& \- W' a
[M,c] = contourf(___) 返回等高线矩阵和等高线对象 c。显示等高线图后,使用 c 设置属性。[1][2] contour和contourf函数用法完全一致。+ M3 U# T9 j# ^2 a D& R4 X
2.2 示例1
5 I9 a. U7 D7 }% 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)& r( k4 A: U6 D6 r8 i4 ]- q
这里绘制 函数在 和 上的图像。
, K, t3 n! i, O) i8 Z8 M左图为等高线图,只有线,颜色表示值的大小,黄色表示峰,蓝色表示谷。9 x8 q5 @3 C+ a( U8 A3 r6 S5 y
右图为填充等高线图,色彩较为明艳,比较好看,因此用得比左图多。9 g9 B7 A7 [; ?5 f6 v z1 q- k
2.3 示例2:改变等高线数目/ r! O2 s# Y& ?7 E6 q
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)
9 [7 k6 @) y6 @ i- x等高线数目是等高线图的重要参数,2.2中的图从最高点到最低点,默认为7个线条。
+ l4 `7 m4 r$ I* d. X1 I5 C3 B, L这里,数量增加到14。不建议数目太多,看起来感觉乱,Ps密集恐惧症简直要犯了,也不建议太少。
6 k+ l0 w' f- B9 M2.4 示例3:显示特定层级
$ y9 T0 `# r! n( G$ s2 d6 e0 Xclc %更多文章,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]), i) [# C+ n: B' v
我们可以控制显示区间,例如这里只显示[-0.5 0.5]之间的数据,大于0.5位黄色,小于-0.5白色,深蓝色为中间值。, }, f/ N2 D! E
2.5 示例4:属性控制& F' l" g) y" U+ s
在图形句柄中有很多参数可以设定,包括颜色、线型、线宽、标签值等等。- I# j( u6 M1 i3 t2 u& \+ b' A7 l* t
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')
; i% o8 Q8 _# v, X; t0 v如,为每一条等高线添加数值标签,这个用的很多。8 [ G$ Y8 g' X6 p3 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, '--','linewidth',2)subplot(1,2,2)contourf(X, Y, Z, 4,'-.','linewidth',2)
" y, C& S$ m# h7 ^8 E: Y: f7 F- n也能改变线型和线宽。
$ I# h# _0 i, _ `2 K2.6 示例5:不显示某些特定值或区域
F" F8 [% ], s9 m; `( j: X) r* o: \7 Mclc %更多文章,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)* d& u. `5 A4 ]
论文中经常遇到某些值、区域不想显示出来,留作空白。那么可以让这些区域的坐标或者值抠除即可,采用NaN赋值即可,如上图所示。
% p; Q) ^( V, q4 h! ^, B/ PNaN即not a number。
6 ?3 s# ` y# C5 v; f持续更新,更多文章请见专栏和目录3 A7 H) r! ]' p
3 H. \" N; b) d' x- ^5 L$ i专栏:MATLAB科学绘图- z1 `; U9 c* e0 E
; |- o" d. S( B4 I: C& d+ {% i
MATLAB画图技巧与实例:目录
& Y9 |* y0 O7 O2 H5 ~" u& M! a% K+ f9 {; g: B1 r
MATLAB画图技巧与实例(一):常用函数
/ ^+ X# F6 A) U
- M, K, f3 w, [! W. |# S4 o. E4 X/ B
参考
4 K( F6 ~( }8 e- L
0 M/ G3 \, Y# X' S4 U+ W- l( |) ?6 P. \( }! x6 q! ?7 [/ y3 k8 o
|