首頁 > 軟體

Python+Matplotlib繪製3D影象的範例詳解

2022-04-14 10:01:37

1. 繪製3D柱狀圖

繪製3D柱狀圖使用的是axes3d.bar()方法。

可能跟我們中學學的有一點不同的是,其語法如下:

bar(left, height, zs=0, zdir=‘z’, *args, **kwargs)

其中left表示指向側邊的軸,zs表示指向我們的方向的軸,height即表示高度的軸。這三者都需要是一維的序列物件。
在呼叫相關方法的時候,比如設定軸標籤,還有一點需要區分的是,left對應的是y軸,zs對應的是x軸。(意思就是說,比如使用plt.xticks()方法,操作的是zs;而使用plt.yticks()方法則操作的是left軸。height對應著z軸。)

一段完整的程式碼範例如下:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.axes3d import Axes3D
import numpy as np
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['axes.facecolor'] = '#cc00ff'
plt.rcParams['font.sans-serif'] = ['STKAITI']
# 建立畫布
fig = plt.figure()
# 建立3D座標系
axes3d = Axes3D(fig)
zs = range(5)
left = np.arange(0, 10)
height = np.array([])
for i in range(len(zs)):
    z = zs[i]
    np.random.seed(i)
    height = np.random.randint(0, 30, size=10)
    axes3d.bar(left, height, zs=z, zdir='x',
               color=['red', 'green', 'purple', 'yellow', 'blue', 'black', 'gray', 'orange', 'pink', 'cyan'])
plt.xticks(zs, ['1月份', '2月份', '3月份', '4月份', '5月份'])
plt.yticks(left, ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'G'])
plt.xlabel('月份')
plt.ylabel('型號')
plt.show()

影象效果如下: 

2. 繪製3D曲面圖

範例1

繪製曲面圖使用的是plot_surface()方法,這個方法的引數相對而言更簡單。且X、Y、Z三者的順序相對較為容易分辨。

通過讀範例程式碼,即可快速掌握其用法:

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
plt.rcParams['font.sans-serif'] = ['STKAITI']
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['axes.facecolor'] = '#cc00ff'
fig = plt.figure(figsize=(10, 8), facecolor='#cc00ff')
ax = Axes3D(fig)
delta = 0.125
# 生成代表X軸資料的列表
x = np.arange(-4.0, 4.0, delta)
# 生成代表Y軸資料的列表
y = np.arange(-3.0, 4.0, delta)
# 對x、y資料執行網格化
X, Y = np.meshgrid(x, y)

Z1 = np.exp(-X**2 - Y**2)
Z2 = np.exp(-(X - 1)**2 - (Y - 1)**2)
# 計算Z軸資料(高度資料)
Z = (Z1 - Z2) * 2
# 繪製3D圖形
ax.plot_surface(X, Y, Z,
    rstride=1,  # rstride(row)指定行的跨度
    cstride=1,  # cstride(column)指定列的跨度
    cmap=plt.get_cmap('rainbow'))  # 設定顏色對映
plt.xlabel('X軸', fontsize=15)
plt.ylabel('Y軸', fontsize=15)
ax.set_zlabel('Z軸', fontsize=15)
ax.set_title('《曲面圖》', y=1.02, fontsize=25, color='gold')
# 設定Z軸範圍
ax.set_zlim(-2, 2)
plt.show()

範例2

更換一組資料,呈現的則是另一種藝術效果:

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
plt.rcParams['font.sans-serif'] = ['STKAITI']
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['axes.facecolor'] = '#cc00ff'
fig = plt.figure(figsize=(12, 10), facecolor='#cc00ff')
ax = Axes3D(fig)
delta = 0.125
# 生成代表X軸資料的列表
x = np.linspace(-2, 2, 10)
# 生成代表Y軸資料的列表
y = np.linspace(-2, 2, 10)
# 對x、y資料執行網格化
X, Y = np.meshgrid(x, y)

# 計算Z軸資料(高度資料)
Z = X**2 - Y**2
# 繪製3D圖形
ax.plot_surface(X, Y, Z,
    rstride=1,  # rstride(row)指定行的跨度
    cstride=1,  # cstride(column)指定列的跨度
    cmap=plt.get_cmap('rainbow'))  # 設定顏色對映
plt.xlabel('X軸', fontsize=15)
plt.ylabel('Y軸', fontsize=15)
ax.set_zlabel('Z軸', fontsize=15)
ax.set_title('《曲面圖》', y=1.02, fontsize=25, color='gold')
plt.show()

3.繪製3D散點圖

在3D曲面圖範例1的基礎上稍作修改。

繪製散點圖使用scatter()方法,將散點顏色設定為綠色,紅色邊沿。

程式碼範例如下:

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
plt.rcParams['font.sans-serif'] = ['STKAITI']
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['axes.facecolor'] = '#cc00ff'
fig = plt.figure(figsize=(10, 8), facecolor='#cc00ff')
ax = Axes3D(fig)
delta = 0.125
# 生成代表X軸資料的列表
x = np.arange(-4.0, 4.0, delta)
# 生成代表Y軸資料的列表
y = np.arange(-3.0, 4.0, delta)
# 對x、y資料執行網格化
X, Y = np.meshgrid(x, y)

Z1 = np.exp(-X**2 - Y**2)
Z2 = np.exp(-(X - 1)**2 - (Y - 1)**2)
# 計算Z軸資料(高度資料)
Z = (Z1 - Z2) * 2
# 繪製3D圖形
ax.scatter(X, Y, Z,
           c='green',
           edgecolors='red')
plt.xlabel('X軸', fontsize=15)
plt.ylabel('Y軸', fontsize=15)
ax.set_zlabel('Z軸', fontsize=15)
ax.set_title('《散點圖》', y=1.02, fontsize=25, color='gold')
# 設定Z軸範圍
ax.set_zlim(-2, 2)
plt.show()

繪圖效果如下:

4. 繪製3D曲線圖

繪製曲線圖,使用的則是我們最最最熟悉的plot()方法。

其他部分基本不變,資料部分生成三組適合我們繪圖的資料,線條為金色,寬度設定為3.

程式碼如下:

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
plt.rcParams['font.sans-serif'] = ['STKAITI']
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['axes.facecolor'] = '#cc00ff'
fig = plt.figure(figsize=(10, 8), facecolor='#cc00ff')
ax = Axes3D(fig)
theta = np.linspace(0, 3.14*10, 1000)
r = np.linspace(0, 1, 1000)
x = r * np.cos(theta)
y = r * np.sin(theta)
z = np.linspace(0, 4, 1000)
ax.plot(x, y, z, color='gold', lw=3)
plt.xlabel('X軸', fontsize=15)
plt.ylabel('Y軸', fontsize=15)
ax.set_zlabel('Z軸', fontsize=15)
ax.set_title('《曲線圖》', y=1.02, fontsize=25, color='gold')
plt.show()

影象效果如下:

以上就是Python+Matplotlib繪製3D影象的範例詳解的詳細內容,更多關於Python Matplotlib 3D影象的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com