【matploblib教程】一文帶你碼遍各種類型三維圖

相信許多使用過python的小夥伴都知道matplotlib是個強大的數據可視化工具,但是大部分小夥伴都只用其繪製平面圖形,本系列將會教大家如何利用matplotlib來繪製3D圖像

一、簡介

相較於之前的版本,最新版的matplotlib只需要通過將關鍵字參數projection="3d" 傳遞給來創建(Axes3D類的)Figure.add_subplot即可創建創建3維畫布,其具體使用同2D相差無幾:

import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

在Matplotlib 1.0.0之前,Axes3D需要先實例化 。

from mpl_toolkits.mplot3d import Axes3D
ax = Axes3D(fig)

而Matplotlib在版本3.2.0中進行了更改:在Matplotlib 3.2.0之前,需要顯式導入 mpl_toolkits.mplot3d模塊,才能將“ 3d”參數傳進 Figure.add_subplot。下面我們就來繪製各種圖像:

二、圖像

1、線圖

函數點擊可以查看該函數源碼

Axes3D.plot(self,xs,ys,* args,zdir ='z'** kwargs )
參數
xs 數據點的x座標
ys 數據點的y座標
zs 數據點的z座標
zdir {‘x’,‘y’,‘z’}繪製2D數據時,用作z的方向(“ x”,“ y”或“ z”);默認爲“ z”。
**kwargs 其他

代碼

import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

t = np.linspace(0, 20, 100)
x = np.sin(t)
y = np.cos(t)

plt.plot(x, y, t)
plt.show()

效果圖
在這裏插入圖片描述

2、散點圖

函數點擊可以查看該函數源碼

Axes3D.scatter(self,xs,ys,zs = 0,zdir ='z',s = 20,c = None,depthshade = True* args,** kwargs )
參數
xs,ys 數據點陣列的位置
zs float類型或類似數組的參數,可選,默認值:0。表示 Z位置。長度與xs和 ys相同的數組,或者是將所有點放置在同一平面上的單個值。
zdir {‘x’,‘y’,‘z’,’-x’,’-y’,’-z’},可選,默認值:‘z’。zs的軸方向。在3D上繪製2D數據時,這很有用。數據必須作爲xs,ys傳遞。然後將zdir設置 爲“ y”,將數據繪製到xz平面上。
s 標量或陣列狀,可選的,默認值:20。標記大小(以磅爲單位)** 2。長度與xs和ys相同的數組或單個值可使所有標記的大小相同。
c 顏色,序列或顏色序列,可選
depthshade bool,可選,默認值:True。是否爲散射標記着色以提供深度外觀。每次調用scatter()都會獨立執行深度着色。

代碼

import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

x = np.random.randint(0, 10, size=50)
y = np.random.randint(0, 10, size=50)
z = np.random.randint(0, 10, size=50)
# 顏色
c = np.random.randint(0, 20, 50)
# 大小
s = np.abs(np.random.randn(50) * 80)
plt.scatter(x, y, zs=z, s=s, c=c)
plt.show()

效果圖:
在這裏插入圖片描述

3、線框圖

函數點擊可以查看該函數源碼

Axes3D.plot_wireframe(self,X,Y,Z,* args,** kwargs )
參數
x,y,z 數據
rcount,ccount int類型。每個方向上使用的最大樣本數。如果輸入數據較大,則會將其下采樣(通過切片)到這些點數。將計數設置爲零會導致不在相應方向上對數據進行採樣,從而生成3D線圖而不是線框圖。默認爲50。
rstride,cstride int類型。下采樣在每個方向上都邁出大步。這些參數與rcount和ccount互斥。如果僅將 rstride或cstride中的一個設置,則其他默認設置爲1。將stride設置爲零會導致不在相應方向上採樣數據,從而生成3D線圖而不是線框圖。

代碼

import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

x, y = np.mgrid[-1:1:10j, -1:1:10j]
z = x * np.exp(-x ** 2 - y ** 2)
ax.plot_wireframe(x, y, z)
plt.show()

加粗樣式效果
在這裏插入圖片描述

4、表面圖

函數點擊可以查看該函數源碼

Axes3D.plot_surface(self,X,Y,Z,* args,norm = None,vmin = None,vmax = None,lightsource = None** kwargs )
參數
xyz 數組
rcount,ccount int類型。每個方向上使用的最大樣本數。如果輸入數據較大,則會將其下采樣(通過切片)到這些點數。默認爲50。
rstride,cstride int類型。下采樣在每個方向上都邁出大步。這些參數與rcount和ccount互斥。如果僅設置rstride或cstride中的一個 ,則其他默認值爲10。“經典”模式使用默認值而不是新的默認值。rstride = cstride = 10rcount = ccount = 50
color 表面補丁的顏色
cmap 表面補丁的顏色圖
facecolors 每個補丁的顏色
norm 歸一化。色彩圖的標準化
vmin, vmax 浮動標準化的界限
shade 布爾類型是否着色。默認爲True。cmap指定時,始終禁用陰影。
lightsource 當shadeTrue 時使用的光源

代碼

import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

X = np.arange(-5, 5, 0.25)
Y = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)

ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='viridis', edgecolor='none')
plt.show()

效果

在這裏插入圖片描述

5、三角網格圖

該示例官方文檔裏面有提供與下方示例有細微差別

函數點擊可以查看該函數源碼

Axes3D.plot_trisurf(self,* args,color = None,norm = None,vmin = None,vmax = None,lightsource = None** kwargs )
參數
X, Y, Z 數組
color 表面補丁的顏色
cmap 表面補丁的顏色圖
norm 一個Normalize實例,用於將值映射到顏色。
vmin, vmax 標量,可選,默認值:無要映射的最小值和最大值。
shade 是否着色。默認爲True。指定cmap時,始終禁用陰影。
lightsource 陰影爲True 時使用的光源

代碼

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.tri as mtri


fig = plt.figure()

u = np.linspace(0, 2.0 * np.pi, endpoint=True, num=50)
v = np.linspace(-0.5, 0.5, endpoint=True, num=10)
u, v = np.meshgrid(u, v)
u, v = u.flatten(), v.flatten()

# triple
x = (1 + 0.5 * v * np.cos(u / 2.0)) * np.cos(u)
y = (1 + 0.5 * v * np.cos(u / 2.0)) * np.sin(u)
z = 0.5 * v * np.sin(u / 2.0)

tri = mtri.Triangulation(u, v)

# Plot the surface.  The triangles in parameter space determine 
ax = fig.add_subplot(1, 1, 1, projection='3d')
ax.plot_trisurf(x, y, z, triangles=tri.triangles, cmap=plt.cm.Spectral)
ax.set_zlim(-1, 1)

效果在這裏插入圖片描述

6、等高線圖

函數點擊可以查看該函數源碼

Axes3D.contour(self,X,Y,Z,* args,extend3d = False,stride = 5,zdir ='z',offset = None** kwargs )
參數
XYZ 輸入數組
extend3d 布爾類型。是否以3D延伸輪廓;默認爲False
stride 延伸輪廓的步長
zdir {‘x’,‘y’,‘z’}。基準軸;默認爲“ z”
offset 標量。如果指定,則在垂直於zdir的平面上的此位置繪製輪廓線的投影

代碼

import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

X = np.arange(-5, 5, 0.25)
Y = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)

ax.contour(X, Y, Z)
plt.show()

效果
在這裏插入圖片描述

7、填充等高線圖

函數點擊可以查看該函數源碼

Axes3D.contourf(self,X,Y,Z,* args,zdir ='z',offset = None** kwargs )
參數
X,Y,Z 輸入數據
zdir {‘x’,‘y’,‘z’}。使用說明;默認爲“ z”。
offset 標量。如果指定,則在垂直於zdir的平面上的此位置繪製輪廓線的投影

代碼:

import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

X = np.arange(-5, 5, 0.25)
Y = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)

ax.contourf(X, Y, Z)
plt.show()

效果:

在這裏插入圖片描述

未完待續……


如果覺得ok,點個贊,點個關注,也歡迎給個打賞支持一下編者的工作
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章