----2021.04.09晚更新----

已新增三維GIF動圖便於觀看。

----原文----

本文講述MATLAB的

surf函式

繪製

三維曲面圖

內容非常重要,平時用得非常非常多。

1 surf函式

1.1 用法

surf

X

Y

Z

surf

X

Y

Z

C

surf

Z

surf

Z

C

surf

ax

___

surf

___

Name

Value

s

=

surf

___

surf(X,Y,Z) 建立一個三維曲面圖,它是一個具有實色邊和實色面的

三維曲面

。該函式將矩陣 Z 中的值繪製為由 X 和 Y 定義的 x-y 平面中的網格上方的高度。曲面的顏色根據 Z 指定的高度而變化。此外,surf(X,Y,Z,C) 還指定曲面的顏色。

surf(Z) 建立一個曲面圖,並將 Z 中元素的列索引和行索引用作 x 座標和 y 座標。此外,surf(Z,C) 還指定曲面的顏色。

surf(ax,___) 將圖形繪製到 ax 指定的座標區中,而不是當前座標區中。指定座標區作為第一個輸入引數。

surf(___,Name,Value) 使用一個或多個名稱-值對組引數指定曲面屬性。例如, ‘FaceAlpha’, 0。5 建立半透明曲面。

s = surf(___) 將返回一個圖曲面物件。在建立曲面之後可使用 s 對其進行修改。有關屬性列表,請參閱 Surface 屬性。

[1]

1.2 示例1

clc

%更多文章,https://zhuanlan。zhihu。com/p/345799328

clear

all

close

all

num

=

50

a

=

linspace

0

2

*

pi

num

);

b

=

linspace

-

0。5

*

pi

0。5

*

pi

num

);

a

b

=

meshgrid

a

b

);

r

=

5

c

=

sqrt

abs

a

-

pi

))

*

1。5

X

=

r

*

cos

b

。*

sin

a

。*

c

Y

=

-

r

*

cos

b

。*

cos

a

。*

c

Z

=

r

。*

sin

b

*

0。75

surf

X

Z

Y

colormap

gca

‘jet’

axis

equal

MATLAB畫圖技巧與例項(二十六):曲面圖surf函式

num=50

MATLAB畫圖技巧與例項(二十六):曲面圖surf函式

GIF動畫

上圖為心形圖。注意,X、Y和Z為繪圖資料,均為

二維矩陣

。不特殊指定的情況下,

顏色預設為 Z 軸高度

。圖例型別這裡換成了 ‘jet’,畫心形圖比 ‘purla’好看。

資料間隔

num 的數值

越大

,圖形就

越精細

,越好看,但是佔用記憶體就更大,甚至可能宕機。num的值

越小

,圖形就

越粗糙

,有時候會影響觀察。因此選擇合理的資料間隔 num 比較重要。下圖 num=20,看起來粗糙得多。

MATLAB畫圖技巧與例項(二十六):曲面圖surf函式

num=20,看起來比較粗糙

1.3 示例2:改變顏色

surf函式的

預設顏色是Z資料

,也可以隨機指定。採用

surf

X

Y

Z

C

命令即可。若X、Y和Z的

維度

為[m, n],那麼C的維度為[m, n, 3]。且

C(i, j, 1:3)

為RGB三顏色。例如,指定

隨機顏色

clc

%更多文章,https://zhuanlan。zhihu。com/p/345799328

clear

all

close

all

num

=

50

a

=

linspace

0

2

*

pi

num

);

b

=

linspace

-

0。5

*

pi

0。5

*

pi

num

);

a

b

=

meshgrid

a

b

);

r

=

5

c

=

sqrt

abs

a

-

pi

))

*

1。5

X

=

r

*

cos

b

。*

sin

a

。*

c

Z

=

-

r

*

cos

b

。*

cos

a

。*

c

Y

=

r

。*

sin

b

*

0。75

for

i

=

1

num

for

j

=

1

num

C

i

j

1

=

rand

1

);

C

i

j

2

=

rand

1

);

C

i

j

3

=

rand

1

);

end

end

surf

X

Y

Z

C

axis

equal

axis

tight

MATLAB畫圖技巧與例項(二十六):曲面圖surf函式

將顏色變為

Z軸方向的漸變紅色

clc

%更多文章,https://zhuanlan。zhihu。com/p/345799328

clear

all

close

all

num

=

50

a

=

linspace

0

2

*

pi

num

);

b

=

linspace

-

0。5

*

pi

0。5

*

pi

num

);

a

b

=

meshgrid

a

b

);

r

=

5

c

=

sqrt

abs

a

-

pi

))

*

1。5

X

=

r

*

cos

b

。*

sin

a

。*

c

Z

=

-

r

*

cos

b

。*

cos

a

。*

c

Y

=

r

。*

sin

b

*

0。75

for

i

=

1

num

for

j

=

1

num

C

i

j

1

=

Z

i

j

/

max

max

Z

))

-

min

min

Z

)))

+

abs

min

min

Z

)))

/

max

max

Z

))

-

min

min

Z

)));

C

i

j

2

=

0

C

i

j

3

=

0

end

end

surf

X

Y

Z

C

axis

equal

axis

tight

MATLAB畫圖技巧與例項(二十六):曲面圖surf函式

1.4 示例3:屬性設定

可以透過控制代碼對圖形的屬性引數進行修改,屬性包括:

AlignVertexCenters

‘off’

AlphaData

1

AlphaDataMapping

‘scaled’

AmbientStrength

0。300000000000000

Annotation

1

×

1

matlab

graphics

eventdata

Annotation

BackFaceLighting

‘reverselit’

BeingDeleted

‘off’

BusyAction

‘queue’

ButtonDownFcn

‘’

CData

150

×

150

×

3

double

CDataMapping

‘scaled’

CDataMode

‘manual’

CDataSource

‘’

Children

0

×

0

GraphicsPlaceholder

Clipping

‘on’

CreateFcn

‘’

DeleteFcn

‘’

DiffuseStrength

0。600000000000000

DisplayName

‘’

EdgeAlpha

1

EdgeColor

‘none’

EdgeLighting

‘none’

FaceAlpha

0。900000000000000

FaceColor

‘interp’

FaceLighting

‘flat’

FaceNormals

149

×

149

×

3

double

FaceNormalsMode

‘auto’

HandleVisibility

‘on’

HitTest

‘on’

Interruptible

‘on’

LineStyle

‘-’

LineWidth

0。500000000000000

Marker

‘none’

MarkerEdgeColor

‘auto’

MarkerFaceColor

‘none’

MarkerSize

6

MeshStyle

‘both’

Parent

1

×

1

Axes

PickableParts

‘visible’

Selected

‘off’

SelectionHighlight

‘on’

SpecularColorReflectance

1

SpecularExponent

10

SpecularStrength

0。900000000000000

Tag

‘’

Type

‘surface’

UIContextMenu

0

×

0

GraphicsPlaceholder

UserData

[]

VertexNormals

150

×

150

×

3

double

VertexNormalsMode

‘auto’

Visible

‘on’

XData

150

×

150

double

XDataMode

‘manual’

XDataSource

‘’

YData

150

×

150

double

YDataMode

‘manual’

YDataSource

‘’

ZData

150

×

150

double

ZDataSource

‘’

這麼多屬性中,常用的是

face 和 edge 的設定

例如,設定

透明色

邊和麵的顏色、顯示

方式等。例如,下圖不顯示邊顏色,並將面顏色的插值方式更改為插值。

clc

%更多文章,https://zhuanlan。zhihu。com/p/345799328

clear

all

close

all

num

=

150

a

=

linspace

0

2

*

pi

num

);

b

=

linspace

-

0。5

*

pi

0。5

*

pi

num

);

a

b

=

meshgrid

a

b

);

r

=

5

c

=

sqrt

abs

a

-

pi

))

*

1。5

X

=

r

*

cos

b

。*

sin

a

。*

c

Z

=

-

r

*

cos

b

。*

cos

a

。*

c

Y

=

r

。*

sin

b

*

0。75

for

i

=

1

num

for

j

=

1

num

C

i

j

1

=

Z

i

j

/

max

max

Z

))

-

min

min

Z

)))

+

abs

min

min

Z

)))

/

max

max

Z

))

-

min

min

Z

)));

C

i

j

2

=

0

C

i

j

3

=

0

end

end

s

=

surf

X

Y

Z

C

);

axis

equal

axis

tight

s

FaceAlpha

=

0。9

s

EdgeColor

=

‘none’

s

FaceColor

=

‘interp’

MATLAB畫圖技巧與例項(二十六):曲面圖surf函式

MATLAB畫圖技巧與例項(二十六):曲面圖surf函式

GIF動圖

注意,在引數設定時,有

‘flat’

‘interp’

‘none’

等用法,其中

'none' 代表不顯示

,flat和interp稍微有區別。顧名思義,

flat就是平的

,統一的顏色,

interp就是插值配色

,區別如下兩圖所示。

MATLAB畫圖技巧與例項(二十六):曲面圖surf函式

flat

MATLAB畫圖技巧與例項(二十六):曲面圖surf函式

interp

邊和麵都可以單獨設定。

當一起設定時,常用

shading用法

,比較簡便,例如

shading

interp

shading

interp

開啟控制代碼可以看到,

shading flat 命令等價於

EdgeColor

‘none’

FaceColor

‘flat’

shading interp 命令等價於

EdgeColor

‘none’

FaceColor

‘interp’

示例如下

clc

%更多文章,https://zhuanlan。zhihu。com/p/345799328

clear

all

close

all

num

=

150

a

=

linspace

0

2

*

pi

num

);

b

=

linspace

-

0。5

*

pi

0。5

*

pi

num

);

a

b

=

meshgrid

a

b

);

r

=

5

c

=

sqrt

abs

a

-

pi

))

*

1。5

X

=

r

*

cos

b

。*

sin

a

。*

c

Z

=

-

r

*

cos

b

。*

cos

a

。*

c

Y

=

r

。*

sin

b

*

0。75

s

=

surf

X

Y

Z

);

axis

equal

axis

tight

shading

interp

MATLAB畫圖技巧與例項(二十六):曲面圖surf函式

2 其他好看的曲面圖

相關程式碼可參考非常漂亮的由數學公式形成的三維模型

[2]

這裡我全部轉化為了MATLAB程式碼。

2.1 克萊因瓶

clc

%更多文章,https://zhuanlan。zhihu。com/p/345799328

clear

all

close

all

num

=

50

u

=

linspace

0

pi

num

*

2

);

v

=

linspace

0

2

*

pi

num

);

u

v

=

meshgrid

u

v

);

a

=

sin

u

);

b

=

cos

u

);

c

=

sin

v

);

d

=

cos

v

);

e

=

3

*

d

-

3

*

b

。^

2。

*

d

-

48

*

b

。^

4。

*

d

+

48

*

b

。^

6。

*

d

-

60

*

a

+

5

*

b

。*

d

。*

a

。。。

-

5

*

b

。^

3。

*

d

。*

a

-

80

*

b

。^

5。

*

d

。*

a

+

80

*

b

。^

7。

*

d

。*

a

X

=

-

2

/

15

*

b

。*

3

*

d

-

30

*

a

+

90

*

b

。^

4。

*

a

-

60

*

b

。^

6。

*

a

+

5

*

b

。*

d

。*

a

);

Y

=

-

1

/

10

*

a

。*

e

Z

=

2

/

15

*

3

+

5

*

b

。*

a

。*

c

surf

X

Y

Z

axis

equal

colormap

‘jet’

MATLAB畫圖技巧與例項(二十六):曲面圖surf函式

2.2 尖的心形圖

clc

%更多文章,https://zhuanlan。zhihu。com/p/345799328

clear

all

close

all

num

=

60

u

=

linspace

0

2

*

pi

num

*

2

);

v

=

linspace

-

pi

/

2

pi

/

2

num

);

u

v

=

meshgrid

u

v

);

r

=

10

p

=

sin

u

。*

sqrt

abs

cos

u

)))

。/

sin

u

+

7

/

5

-

2

*

sin

u

+

2

x

=

p

。*

cos

u

);

y

=

p

。*

sin

u

+

1。5

X

=

x

。*

cos

v

);

Y

=

0。8

*

sin

v

);

Z

=

y

。*

cos

v

);

surf

X

Y

Z

colormap

‘jet’

axis

equal

MATLAB畫圖技巧與例項(二十六):曲面圖surf函式

2.3 腎圖

clc

%更多文章,https://zhuanlan。zhihu。com/p/345799328

clear

all

close

all

num

=

60

u

=

linspace

0

2

*

pi

num

);

v

=

linspace

-

pi

/

2

pi

/

2

num

);

u

v

=

meshgrid

u

v

);

r

=

sin

u

))

。^

3

+

cos

u

))

。^

3

x

=

r

。*

sin

u

-

0。3

y

=

r

。*

cos

u

-

0。3

a

=

10

b

=

2。5

X

=

x

。*

a

。*

cos

v

);

Y

=

b

。*

sin

v

);

Z

=

y

。*

a

。*

cos

v

);

surf

X

Y

Z

colormap

‘jet’

axis

equal

MATLAB畫圖技巧與例項(二十六):曲面圖surf函式

2.4 螺圖

2。4。1 海螺

clc

%更多文章,https://zhuanlan。zhihu。com/p/345799328

clear

all

close

all

num

=

60

u

=

linspace

0

6

*

pi

num

*

3

);

v

=

linspace

0

2

*

pi

num

);

u

v

=

meshgrid

u

v

);

k

=

1。2

a

=

1。5

w

=

k

。^

u

。*

1

+

cos

v

));

X

=

w

。*

cos

u

);

Y

=

w

。*

sin

u

);

Z

=

k

。^

u

。*

sin

v

-

k

。^

u

。*

a

surf

X

Y

Z

colormap

‘jet’

axis

equal

MATLAB畫圖技巧與例項(二十六):曲面圖surf函式

2。4。2 海螺2

clc

%更多文章,https://zhuanlan。zhihu。com/p/345799328

clear

all

close

all

num

=

60

u

=

linspace

0

20

*

pi

num

*

20

);

v

=

linspace

0

2

*

pi

num

);

u

v

=

meshgrid

u

v

);

m

=

-

0。09

k

=

3

a

=

1

b

=

1

e

=

exp

m

*

u

);

w

=

a

+

b

。*

cos

v

))

。*

e

X

=

w

。*

cos

u

);

Y

=

w

。*

sin

u

);

Z

=

k

。*

a

+

b

。*

sin

v

))

。*

e

surf

X

Y

Z

colormap

‘jet’

axis

equal

MATLAB畫圖技巧與例項(二十六):曲面圖surf函式

2。4。3 貝殼

clc

%更多文章,https://zhuanlan。zhihu。com/p/345799328

clear

all

close

all

num

=

60

u

=

linspace

0

2

*

pi

num

*

2

);

v

=

linspace

0

2

*

pi

num

);

u

v

=

meshgrid

u

v

);

r

=

sin

v

。*

exp

-

u

);

X

=

r

。*

sin

v

。*

sin

u

);

Y

=

r

。*

cos

v

);

Z

=

r

。*

sin

v

。*

cos

u

);

surf

X

Y

Z

colormap

‘jet’

axis

equal

MATLAB畫圖技巧與例項(二十六):曲面圖surf函式

MATLAB畫圖技巧與例項(二十六):曲面圖surf函式

2.5 水滴

clc

%更多文章,https://zhuanlan。zhihu。com/p/345799328

clear

all

close

all

num

=

60

u

=

linspace

0

pi

num

);

v

=

linspace

0

2

*

pi

num

*

2

);

u

v

=

meshgrid

u

v

);

m

=

1。5

n

=

10

*

sin

u

。*

sin

u

/

2

))

。^

m

Z

=

10

*

cos

u

);

X

=

n

。*

cos

v

);

Y

=

n

。*

sin

v

);

surf

X

Y

Z

colormap

‘jet’

axis

equal

MATLAB畫圖技巧與例項(二十六):曲面圖surf函式

持續更新,更多文章請見專欄和目錄

專欄:MATLAB科學繪圖

MATLAB畫圖技巧與例項:目錄

MATLAB畫圖技巧與例項(一):常用函式

參考

^

MATLAB幫助文件

https://ww2。mathworks。cn/help/matlab/ref/surf。html

^https://www。zhihu。com/question/29751266/answer/45477643