python中Matplotlib實現繪製3D圖的範例程式碼,pythonmatplotlib

來源:互聯網
上載者:User

python中Matplotlib實現繪製3D圖的範例程式碼,pythonmatplotlib

Matplotlib 也可以繪製 3D 映像,與二維映像不同的是,繪製三維映像主要通過 mplot3d 模組實現。但是,使用 Matplotlib 繪製三維映像實際上是在二維畫布上展示,所以一般繪製三維映像時,同樣需要載入 pyplot 模組。
mplot3d 模組下主要包含 4 個大類,分別是:

  • mpl_toolkits.mplot3d.axes3d()
  • mpl_toolkits.mplot3d.axis3d()
  • mpl_toolkits.mplot3d.art3d()
  • mpl_toolkits.mplot3d.proj3d()

其中,axes3d() 下面主要包含了各種實現繪圖的類和方法。axis3d() 主要是包含了和座標軸相關的類和方法。art3d() 包含了一些可將 2D 映像轉換並用於 3D 繪製的類和方法。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 Axes3Dimport 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 Axes3Dimport matplotlib.pyplot as pltimport 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 Axes3Dimport matplotlib.pyplot as pltimport 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 npimport matplotlib.pyplot as pltfrom 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 Axes3Dimport numpy as npimport matplotlib.pyplot as plt# 建立 3D 繪圖物件fig = plt.figure()ax = Axes3D(fig)# 產生資料並繪製圖 1x1 = np.linspace(-3 * np.pi, 3 * np.pi, 500)y1 = np.sin(x1)ax.plot(x1, y1, zs=0, c='red')# 產生資料並繪製圖 2x2 = 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 Axes3Dimport matplotlib.pyplot as pltimport 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)#===============# 向畫布添加子圖 2ax2 = 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'參數。

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援幫客之家。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.