本篇文章主要介紹了python中Matplotlib實作繪製3D圖的範例程式碼,具有一定的參考價值,有興趣的可以了解一下
Matplotlib 也可以繪製3D 影像,與二維影像不同的是,繪製三維影像主要透過mplot3d 模組實現。但是,使用 Matplotlib 繪製三維影像實際上是在二維畫布上展示,所以一般繪製三維影像時,同樣需要載入 pyplot 模組。
mplot3d 模組下主要包含4 個大類,分別是:
mpl_toolkits.mplot3d.axes3d()
#mpl_toolkits.mplot3d .axis3d()
mpl_toolkits.mplot3d.art3d()
mpl_toolkits.mplot3d.proj3d()
一般情況下,我們用到最多的就是mpl_toolkits.mplot3d.axes3d() 中的mpl_toolkits.mplot3d.axes3d.Axes3D() 類,而Axes3D() 下面又存在繪製不同類型3D圖的方法。你可以透過下面的方式導入 Axes3D()。
from mpl_toolkits.mplot3d.axes3d import Axes3D或from mpl_toolkits.mplot3d import Axes3D
#三維散點圖## numpy 隨機產生一組資料。import numpy as np # x, y, z 均为 0 到 1 之间的 100 个随机数 x = np.random.normal(0, 1, 100) y = np.random.normal(0, 1, 100) z = np.random.normal(0, 1, 100)接下來,開始繪圖。第一步是載入 2D, 3D 繪圖模組。
from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt
第二步,使用 Axes3D() 建立 3D 圖形物件。
fig = plt.figure()
ax = Axes3D(fig)
最後,呼叫散點圖繪製方法繪圖並顯示出來。
ax.scatter(x, y, z) plt.show()
線形圖和散佈圖相似,需要傳入x, y, z 三個座標的數值。詳細的程式碼如下。
# 载入模块 from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt import numpy as np # 生成数据 x = np.linspace(-6 * np.pi, 6 * np.pi, 1000) y = np.sin(x) z = np.cos(x) # 创建 3D 图形对象 fig = plt.figure() ax = Axes3D(fig) # 绘制线型图 ax.plot(x, y, z) # 显示图 plt.show()
三維柱狀圖
#繪製完線型圖,我們繼續嘗試繪製三維柱狀圖,其實它的繪製步驟和上面同樣非常相似。
# 载入模块 from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt import numpy as np # 创建 3D 图形对象 fig = plt.figure() ax = Axes3D(fig) # 生成数据并绘图 x = [0, 1, 2, 3, 4, 5, 6] for i in x: y = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] z = abs(np.random.normal(1, 10, 10)) ax.bar(y, z, i, zdir='y', color=['r', 'g', 'b', 'y']) plt.show()
# 载入模块 import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # 创建 3D 图形对象 fig = plt.figure() ax = Axes3D(fig) # 生成数据 X = np.arange(-2, 2, 0.1) Y = np.arange(-2, 2, 0.1) X, Y = np.meshgrid(X, Y) Z = np.sqrt(X ** 2 + Y ** 2) # 绘制曲面图,并使用 cmap 着色 ax.plot_surface(X, Y, Z, cmap=plt.cm.winter) plt.show()###cmap=plt.cm.winter 表示採用了 winter 配色方案,也就是下圖的漸層色。 #########混合圖繪製#########混合圖就是將兩種不同類型的圖繪製在一張圖裡。繪製混合圖一般有前提條件,那就是兩種不同類型圖的範圍大致相同,否則將會出現嚴重的比例不協調,而使得混合圖失去意義。 ############
# -*- coding: utf-8 -* # 载入模块 from mpl_toolkits.mplot3d import Axes3D import numpy as np import matplotlib.pyplot as plt # 创建 3D 图形对象 fig = plt.figure() ax = Axes3D(fig) # 生成数据并绘制图 1 x1 = np.linspace(-3 * np.pi, 3 * np.pi, 500) y1 = np.sin(x1) ax.plot(x1, y1, zs=0, c='red') # 生成数据并绘制图 2 x2 = np.random.normal(0, 1, 100) y2 = np.random.normal(0, 1, 100) z2 = np.random.normal(0, 1, 100) ax.scatter(x2, y2, z2) # 显示图 plt.show()######子圖繪製################
# -*- coding: utf-8 -* # 载入模块 from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt import numpy as np # 创建 1 张画布 fig = plt.figure() #=============== # 向画布添加子图 1 ax1 = fig.add_subplot(1, 2, 1, projection='3d') # 生成子图 1 数据 x = np.linspace(-6 * np.pi, 6 * np.pi, 1000) y = np.sin(x) z = np.cos(x) # 绘制第 1 张图 ax1.plot(x, y, z) #=============== # 向画布添加子图 2 ax2 = fig.add_subplot(1, 2, 2, projection='3d') # 生成子图 2 数据 X = np.arange(-2, 2, 0.1) Y = np.arange(-2, 2, 0.1) X, Y = np.meshgrid(X, Y) Z = np.sqrt(X ** 2 + Y ** 2) # 绘制第 2 张图 ax2.plot_surface(X, Y, Z, cmap=plt.cm.winter) # 显示图 plt.show()###我們可以來看這些程式碼。由於兩張子圖是繪製在 1 張畫布上面的,所以這裡需要事先建立 1 張畫布。然後透過.add_subplot()加入子圖,子圖序號和二維繪圖相似,只是注意 3D 繪圖時要新增projection='3d'參數。 ###
以上是python中Matplotlib實作繪製3D圖方法介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!