日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python 三维数据绘制等值高线剖面图_Matplotlib中的三维绘图

發(fā)布時(shí)間:2023/12/14 python 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 三维数据绘制等值高线剖面图_Matplotlib中的三维绘图 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。