MATLAB畫圖技巧與例項(二十六):曲面圖surf函式
----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
num=50
GIF動畫
上圖為心形圖。注意,X、Y和Z為繪圖資料,均為
二維矩陣
。不特殊指定的情況下,
顏色預設為 Z 軸高度
。圖例型別這裡換成了 ‘jet’,畫心形圖比 ‘purla’好看。
資料間隔
num 的數值
越大
,圖形就
越精細
,越好看,但是佔用記憶體就更大,甚至可能宕機。num的值
越小
,圖形就
越粗糙
,有時候會影響觀察。因此選擇合理的資料間隔 num 比較重要。下圖 num=20,看起來粗糙得多。
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
將顏色變為
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
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’
;
GIF動圖
注意,在引數設定時,有
‘flat’
‘interp’
‘none’
等用法,其中
'none' 代表不顯示
,flat和interp稍微有區別。顧名思義,
flat就是平的
,統一的顏色,
interp就是插值配色
,區別如下兩圖所示。
flat
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
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’
)
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
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
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
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
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
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科學繪圖
MATLAB畫圖技巧與例項:目錄
MATLAB畫圖技巧與例項(一):常用函式
參考
^
MATLAB幫助文件
https://ww2。mathworks。cn/help/matlab/ref/surf。html
^https://www。zhihu。com/question/29751266/answer/45477643