python 三维数据绘制等值高线剖面图_Matplotlib中的三维绘图
Matplotlib最初設(shè)計(jì)時(shí)只考慮了二維繪圖。在1.0版本發(fā)布時(shí),一些三維繪圖實(shí)用程序構(gòu)建在Matplotlib的二維顯示之上,結(jié)果是一組方便(如果有限)的三維數(shù)據(jù)可視化工具。通過(guò)導(dǎo)入mplot3d主Matplotlib安裝中包含的工具包來(lái)啟用三維圖:
from mpl_toolkits import mplot3d
導(dǎo)入此子模塊后,可以通過(guò)將關(guān)鍵字傳遞projection='3d'給任何法線軸創(chuàng)建例程來(lái)創(chuàng)建三維軸:
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax = plt.axes(projection='3d')
啟用此三維軸后,我們現(xiàn)在可以繪制各種三維繪圖類型。三維繪圖是通過(guò)交互式觀看數(shù)字而非靜態(tài)地在筆記本中觀看數(shù)字而獲益的功能之一;回想一下,要使用交互式數(shù)字,您可以使用%matplotlib notebook而不是%matplotlib inline在運(yùn)行此代碼時(shí)使用。
三維點(diǎn)和線
最基本的三維圖是根據(jù)(x,y,z)三元組創(chuàng)建的散點(diǎn)圖的線或集合。與前面討論的更常見(jiàn)的二維圖類比,可以使用ax.plot3D和ax.scatter3D函數(shù)創(chuàng)建這些圖。這些的調(diào)用簽名幾乎與其二維對(duì)應(yīng)的簽名相同,因此您可以參考
ax = plt.axes(projection='3d')
# Data for a three-dimensional line
zline = np.linspace(0, 15, 1000)
xline = np.sin(zline)
yline = np.cos(zline)
ax.plot3D(xline, yline, zline, 'gray')
# Data for three-dimensional scattered points
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');
請(qǐng)注意,默認(rèn)情況下,散點(diǎn)會(huì)調(diào)整其透明度,以便在頁(yè)面上給出深度感。雖然在靜態(tài)圖像中有時(shí)難以看到三維效果,但是交互式視圖可以導(dǎo)致關(guān)于點(diǎn)的布局的一些很好的直覺(jué)。
三維輪廓圖
類似于我們?cè)趍plot3d包含使用相同輸入創(chuàng)建三維浮雕圖的工具。與二維ax.contour圖一樣,ax.contour3D要求所有輸入數(shù)據(jù)都采用二維規(guī)則網(wǎng)格的形式,并在每個(gè)點(diǎn)評(píng)估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');
有時(shí)默認(rèn)的視角不是最佳的,在這種情況下我們可以使用該view_init方法來(lái)設(shè)置高程和方位角。在下面的示例中,我們將使用60度的高程(即xy平面上方60度)和35度的方位角(即繞z軸逆時(shí)針旋轉(zhuǎn)35度):
ax.view_init(60, 35)
fig
再次注意,當(dāng)使用Matplotlib的交互式后端之一時(shí),通過(guò)單擊和拖動(dòng)可以交互式地完成這種類型的旋轉(zhuǎn)。
表面三角測(cè)量
對(duì)于某些應(yīng)用,上述例程所需的均勻采樣網(wǎng)格過(guò)于嚴(yán)格且不方便。在這些情況下,基于三角測(cè)量的圖可能非常有用。如果不是從笛卡爾坐標(biāo)或極坐標(biāo)網(wǎng)格中得到平均值,我們會(huì)有一組隨機(jī)抽取?
fig = plt.figure()
ax = plt.axes(projection='3d')
ax.plot_wireframe(X, Y, Z, color='black')
ax.set_title('wireframe');
我們可以創(chuàng)建點(diǎn)的散點(diǎn)圖,以了解我們從中采樣的表面:
ax = plt.axes(projection='3d')
ax.plot_surface(X, Y, Z, rstride=1, cstride=1,
cmap='viridis', edgecolor='none')
ax.set_title('surface');
這留下了許多不足之處。在這種情況下幫助我們的功能是ax.plot_trisurf,通過(guò)首先找到在相鄰點(diǎn)之間形成的一組三角形來(lái)創(chuàng)建表面(請(qǐng)記住,x,y和z這里是一維數(shù)組):
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');
結(jié)果當(dāng)然不像用網(wǎng)格繪制時(shí)那樣干凈,但這種三角測(cè)量的靈活性允許一些非常有趣的三維圖。
總結(jié)
以上是生活随笔為你收集整理的python 三维数据绘制等值高线剖面图_Matplotlib中的三维绘图的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: matlab 海面反射,海面波浪模拟 M
- 下一篇: python计算连续复利_复利的Pyth