怎么在python中利用matplotlib創(chuàng)建一個(gè)三維圖表-創(chuàng)新互聯(lián)

本篇文章為大家展示了怎么在python中利用matplotlib創(chuàng)建一個(gè)三維圖表,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

創(chuàng)新互聯(lián)專注于石拐網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供石拐營銷型網(wǎng)站建設(shè),石拐網(wǎng)站制作、石拐網(wǎng)頁設(shè)計(jì)、石拐網(wǎng)站官網(wǎng)定制、微信小程序服務(wù),打造石拐網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供石拐網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。

 Matplotlib 自動安裝:

from mpl_toolkits import mplot3d

一旦模塊被導(dǎo)入,三維 axes 就可以像其他普通 axes 一樣通過關(guān)鍵字參數(shù)projection='3d'來創(chuàng)建:

import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax = plt.axes(projection='3d')
plt.show()

怎么在python中利用matplotlib創(chuàng)建一個(gè)三維圖表

三維 axes 激活后,我們可以在上面繪制不同的三維圖表類型。三維圖表在 notebook 中使用交互式圖表展示會優(yōu)于使用靜態(tài)展示;回憶我們前面介紹過,你可以使用%matplotlib notebook而不是%matplotlib inline來激活交互式展示模式。

三維的點(diǎn)和線

三維圖表中最基礎(chǔ)的是使用(x, y, z)坐標(biāo)定義的一根線或散點(diǎn)的集合。前面介紹過普通的二維圖表,作為類比,使用ax.plot3D和ax.scatter3D函數(shù)可以創(chuàng)建三維折線和散點(diǎn)圖。這兩個(gè)函數(shù)的簽名與二維的版本基本一致,你可以參考[簡單折線圖]和[簡單散點(diǎn)圖]來復(fù)習(xí)一下這部分的內(nèi)容。下面我們繪制一個(gè)三維中的三角螺旋,在線的附近在繪制一些隨機(jī)的點(diǎn):

ax = plt.axes(projection='3d')

# 三維螺旋線的數(shù)據(jù)
zline = np.linspace(0, 15, 1000)
xline = np.sin(zline)
yline = np.cos(zline)
ax.plot3D(xline, yline, zline, 'gray')

# 三維散點(diǎn)的數(shù)據(jù)
zdata = 15 * np.random.random(100)
xdata = np.sin(zdata) + 0.1 * np.random.randn(100)
ydata = np.cos(zdata) + 0.1 * np.random.randn(100)
ax.scatter3D(xdata, ydata, zdata, c=zdata, cmap='Greens');

怎么在python中利用matplotlib創(chuàng)建一個(gè)三維圖表

注意默認(rèn)情況下,圖中的散點(diǎn)會有透明度的區(qū)別,用于體現(xiàn)在圖中散點(diǎn)的深度。雖然三維效果在靜態(tài)圖像中難以顯示,你可以使用交互式的視圖來獲得更佳的三維直觀效果。

三維輪廓圖

類似于我們在[密度和輪廓圖]中介紹的內(nèi)容,mplot3d也包含著能夠創(chuàng)建三維浮雕圖像的工具。就像二維的ax.contour圖表,ax.contour3D要求輸入數(shù)據(jù)的格式是二維普通網(wǎng)格上計(jì)算得到的 Z 軸的數(shù)據(jù)值。下面我們展示一個(gè)三維的正弦函數(shù)輪廓圖:

def f(x, y):
  return np.sin(np.sqrt(x ** 2 + y ** 2))

x = np.linspace(-6, 6, 30)
y = np.linspace(-6, 6, 30)

X, Y = np.meshgrid(x, y)
Z = f(X, Y)
fig = plt.figure()
ax = plt.axes(projection='3d')
ax.contour3D(X, Y, Z, 50, cmap='binary')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z');

怎么在python中利用matplotlib創(chuàng)建一個(gè)三維圖表

有時(shí)候默認(rèn)的視角角度不是最理想的,在這種情況下我們可以使用view_init函數(shù)來設(shè)置水平角和方位角。在下面的例子中,我們使用的是 60° 的水平角(即以 60° 俯視 x-y 平面)和 35° 的方位角(即將 z 軸逆時(shí)針旋轉(zhuǎn) 35°):

ax.view_init(60, 35)
fig

怎么在python中利用matplotlib創(chuàng)建一個(gè)三維圖表

同樣,注意到當(dāng)使用 Matplotlib 交互式展示是,這樣的旋轉(zhuǎn)可以通過鼠標(biāo)點(diǎn)擊和拖拽來實(shí)現(xiàn)。

框線圖和表面圖

使用網(wǎng)格數(shù)據(jù)生成的三維圖表還有框線圖和表面圖。這兩種圖表將網(wǎng)格數(shù)據(jù)投射到特定的三維表面,能夠使得結(jié)果圖像非常直觀和具有說服力。下面是一個(gè)框線圖的例子:

fig = plt.figure()
ax = plt.axes(projection='3d')
ax.plot_wireframe(X, Y, Z, color='black')
ax.set_title('wireframe');

怎么在python中利用matplotlib創(chuàng)建一個(gè)三維圖表

表面圖類似框線圖,區(qū)別在于每個(gè)框線構(gòu)成的多邊形都使用顏色進(jìn)行了填充。添加色圖用于填充多邊形能夠讓圖形表面展示出來:

ax = plt.axes(projection='3d')
ax.plot_surface(X, Y, Z, rstride=1, cstride=1,
        cmap='viridis', edgecolor='none')
ax.set_title('surface');

怎么在python中利用matplotlib創(chuàng)建一個(gè)三維圖表

注意雖然每個(gè)顏色填充的表面都是二維的,但是表面的邊緣不需要是直線構(gòu)成的。下面的例子使用surface3D繪制了一個(gè)部分極坐標(biāo)網(wǎng)格,能夠讓我們切入到函數(shù)內(nèi)部觀察效果:

r = np.linspace(0, 6, 20)
theta = np.linspace(-0.9 * np.pi, 0.8 * np.pi, 40)
r, theta = np.meshgrid(r, theta)

X = r * np.sin(theta)
Y = r * np.cos(theta)
Z = f(X, Y)

ax = plt.axes(projection='3d')
ax.plot_surface(X, Y, Z, rstride=1, cstride=1,
        cmap='viridis', edgecolor='none');

怎么在python中利用matplotlib創(chuàng)建一個(gè)三維圖表

表面三角剖分

在一些應(yīng)用場合中,上面的這種均勻網(wǎng)格繪制的圖表方式太過于局限和不方便。在這些情況下,三角剖分的圖表可以派上用場。如果我們并不是使用笛卡爾坐標(biāo)系或極坐標(biāo)系的網(wǎng)格來繪制三維圖表,而是使用一組隨機(jī)的點(diǎn)來繪制三維圖表呢?

theta = 2 * np.pi * np.random.random(1000)
r = 6 * np.random.random(1000)
x = np.ravel(r * np.sin(theta))
y = np.ravel(r * np.cos(theta))
z = f(x, y)
ax = plt.axes(projection='3d')
ax.scatter(x, y, z, c=z, cmap='viridis', linewidth=0.5);

怎么在python中利用matplotlib創(chuàng)建一個(gè)三維圖表

上圖并未形象的表示出表面情況。這種情況下我們可以使用ax.plot_trisurf函數(shù),它能首先根據(jù)我們的數(shù)據(jù)輸入找到各點(diǎn)內(nèi)在的三角函數(shù)形式,然后繪制表面(注意的是這里的 x,y,z 是一維的數(shù)組):

ax = plt.axes(projection='3d')
ax.plot_trisurf(x, y, z,
        cmap='viridis', edgecolor='none');

怎么在python中利用matplotlib創(chuàng)建一個(gè)三維圖表

上圖的結(jié)果很顯然沒有使用網(wǎng)格繪制表面圖那么清晰,但是對于我們并不是使用函數(shù)構(gòu)建數(shù)據(jù)樣本(數(shù)據(jù)樣本通常來自真實(shí)世界的采樣)的情況下,這能提供很大的幫助。例如我們下面會看到,能使用這種方法繪制一條三維的莫比烏斯環(huán)。

例子:繪制莫比烏斯環(huán)

怎么在python中利用matplotlib創(chuàng)建一個(gè)三維圖表

theta = np.linspace(0, 2 * np.pi, 30)
w = np.linspace(-0.25, 0.25, 8)
w, theta = np.meshgrid(w, theta)

怎么在python中利用matplotlib創(chuàng)建一個(gè)三維圖表

phi = 0.5 * theta

現(xiàn)在我們已經(jīng)有了所有需要獲得三維坐標(biāo)值的參數(shù)了。我們定義  為每個(gè)坐標(biāo)點(diǎn)距離環(huán)形中間的位置,使用它來計(jì)算最終(x,y,z)  三維坐標(biāo)系的坐標(biāo)值:

# r是坐標(biāo)點(diǎn)距離環(huán)形中心的距離值
r = 1 + w * np.cos(phi)
# 利用簡單的三角函數(shù)知識算得x,y,z坐標(biāo)值
x = np.ravel(r * np.cos(theta))
y = np.ravel(r * np.sin(theta))
z = np.ravel(w * np.sin(phi))

最后,為了繪制對象,我們必須保證三角剖分是正確的。實(shí)現(xiàn)這個(gè)好的方法是在底層的參數(shù)上面實(shí)現(xiàn)三角剖分,最后讓 Matplotlib 將這個(gè)三角剖分投射到三維空間中形成莫比烏斯環(huán)。下面的代碼最終繪制圖形:

# 在底層參數(shù)的基礎(chǔ)上進(jìn)行三角剖分
from matplotlib.tri import Triangulation
tri = Triangulation(np.ravel(w), np.ravel(theta))

ax = plt.axes(projection='3d')
ax.plot_trisurf(x, y, z, triangles=tri.triangles,
        cmap='viridis', linewidths=0.2);

ax.set_xlim(-1, 1); ax.set_ylim(-1, 1); ax.set_zlim(-1, 1);

怎么在python中利用matplotlib創(chuàng)建一個(gè)三維圖表

上述內(nèi)容就是怎么在python中利用matplotlib創(chuàng)建一個(gè)三維圖表,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

新聞標(biāo)題:怎么在python中利用matplotlib創(chuàng)建一個(gè)三維圖表-創(chuàng)新互聯(lián)
分享地址:http://bm7419.com/article30/dsdgpo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站云服務(wù)器、網(wǎng)站營銷商城網(wǎng)站、服務(wù)器托管網(wǎng)站設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化