python中Matplotlib實現(xiàn)繪制3D圖的示例代碼
Matplotlib 也可以繪制 3D 圖像,與二維圖像不同的是,繪制三維圖像主要通過 mplot3d 模塊實現(xiàn)。但是,使用 Matplotlib 繪制三維圖像實際上是在二維畫布上展示,所以一般繪制三維圖像時,同樣需要載入 pyplot 模塊。
mplot3d 模塊下主要包含 4 個大類,分別是:
- mpl_toolkits.mplot3d.axes3d()
- mpl_toolkits.mplot3d.axis3d()
- mpl_toolkits.mplot3d.art3d()
- mpl_toolkits.mplot3d.proj3d()
其中,axes3d() 下面主要包含了各種實現(xiàn)繪圖的類和方法。axis3d() 主要是包含了和坐標(biāo)軸相關(guān)的類和方法。art3d() 包含了一些可將 2D 圖像轉(zhuǎn)換并用于 3D 繪制的類和方法。proj3d() 中包含一些零碎的類和方法,例如計算三維向量長度等。
一般情況下,我們用到最多的就是 mpl_toolkits.mplot3d.axes3d() 中的mpl_toolkits.mplot3d.axes3d.Axes3D() 類,而 Axes3D() 下面又存在繪制不同類型 3D 圖的方法。你可以通過下面的方式導(dǎo)入 Axes3D()。
from mpl_toolkits.mplot3d.axes3d import Axes3D或from mpl_toolkits.mplot3d import Axes3D
三維散點圖
首先,我們導(dǎo)入 numpy 隨機生成一組數(shù)據(jù)。
import numpy as np # x, y, z 均為 0 到 1 之間的 100 個隨機數(shù) 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() 創(chuàng)建 3D 圖形對象。
fig = plt.figure() ax = Axes3D(fig)
最后,調(diào)用散點圖繪制方法繪圖并顯示出來。
ax.scatter(x, y, z) plt.show()
三維線型圖
線形圖和散點圖相似,需要傳入 x, y, z 三個坐標(biāo)的數(shù)值。詳細的代碼如下。
# 載入模塊 from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt import numpy as np # 生成數(shù)據(jù) x = np.linspace(-6 * np.pi, 6 * np.pi, 1000) y = np.sin(x) z = np.cos(x) # 創(chuàng)建 3D 圖形對象 fig = plt.figure() ax = Axes3D(fig) # 繪制線型圖 ax.plot(x, y, z) # 顯示圖 plt.show()
三維柱狀圖
繪制完線型圖,我們繼續(xù)嘗試?yán)L制三維柱狀圖,其實它的繪制步驟和上面同樣非常相似。
# 載入模塊 from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt import numpy as np # 創(chuàng)建 3D 圖形對象 fig = plt.figure() ax = Axes3D(fig) # 生成數(shù)據(jù)并繪圖 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()
三維圖曲面圖
接下來需要繪制的三維曲面圖要麻煩一些,我們需要對數(shù)據(jù)進行矩陣處理。其實和畫二維等高線圖很相似,只是多增加了一個維度。
# 載入模塊 import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # 創(chuàng)建 3D 圖形對象 fig = plt.figure() ax = Axes3D(fig) # 生成數(shù)據(jù) 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 配色方案,也就是下圖的漸變色。
混合圖繪制
混合圖就是將兩種不同類型的圖繪制在一張圖里。繪制混合圖一般有前提條件,那就是兩種不同類型圖的范圍大致相同,否則將會出現(xiàn)嚴(yán)重的比例不協(xié)調(diào),而使得混合圖失去意義。
# -*- coding: utf-8 -* # 載入模塊 from mpl_toolkits.mplot3d import Axes3D import numpy as np import matplotlib.pyplot as plt # 創(chuàng)建 3D 圖形對象 fig = plt.figure() ax = Axes3D(fig) # 生成數(shù)據(jù)并繪制圖 1 x1 = np.linspace(-3 * np.pi, 3 * np.pi, 500) y1 = np.sin(x1) ax.plot(x1, y1, zs=0, c='red') # 生成數(shù)據(jù)并繪制圖 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 # 創(chuàng)建 1 張畫布 fig = plt.figure() #=============== # 向畫布添加子圖 1 ax1 = fig.add_subplot(1, 2, 1, projection='3d') # 生成子圖 1 數(shù)據(jù) 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 數(shù)據(jù) 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 張畫布上面的,所以這里需要提前創(chuàng)建 1 張畫布。然后通過.add_subplot()添加子圖,子圖序號和二維繪圖相似,只是注意 3D 繪圖時要添加projection='3d'參數(shù)。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python實現(xiàn)手寫一個類似django的web框架示例
這篇文章主要介紹了Python實現(xiàn)手寫一個類似django的web框架,結(jié)合具體實例形式分析了Python自定義簡單控制器、URL路由、視圖模型等功能,實現(xiàn)類似Django框架的web應(yīng)用相關(guān)操作技巧,需要的朋友可以參考下2018-07-07python導(dǎo)入csv文件出現(xiàn)SyntaxError問題分析
這篇文章主要介紹了python導(dǎo)入csv文件出現(xiàn)SyntaxError問題分析,同時涉及python導(dǎo)入csv文件的三種方法,具有一定借鑒價值,需要的朋友可以參考下。2017-12-12python調(diào)用百度地圖WEB服務(wù)API獲取地點對應(yīng)坐標(biāo)值
這篇文章主要為大家詳細介紹了python調(diào)用百度地圖WEB服務(wù)API獲取地點對應(yīng)坐標(biāo)值,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-01-01python3的數(shù)據(jù)類型及數(shù)據(jù)類型轉(zhuǎn)換實例詳解
在本文里小編給大家分享的是關(guān)于python3的數(shù)據(jù)類型及數(shù)據(jù)類型轉(zhuǎn)換以及相關(guān)實例內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2019-08-08使用Python實現(xiàn)Oracle數(shù)據(jù)庫自動巡檢程序
這篇文章主要為大家詳細介紹了如何創(chuàng)建一個Oracle數(shù)據(jù)庫自動巡檢程序,以確保數(shù)據(jù)庫的順暢運行,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01django中上傳圖片分頁三級聯(lián)動效果的實現(xiàn)代碼
這篇文章主要介紹了django中上傳圖片分頁三級聯(lián)動效果的實現(xiàn)代碼,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧2019-08-08