利用python繪制二三維曲面和矢量流線圖的代碼示例
為了實(shí)現(xiàn)不同數(shù)據(jù)的可視化,最近研究了python環(huán)境下的可視化方案,為后續(xù)的流體運(yùn)動(dòng)仿真模擬做好儲(chǔ)備,由于python處理數(shù)據(jù)的便利性,導(dǎo)致目前很多后端處理或者可視化成圖操作都在python中實(shí)現(xiàn),比如前端是vue,加上簡(jiǎn)單的交互操作,后端搭建webserver,可采用java或者python來(lái)搭建,并利用python在后端處理數(shù)據(jù),形成可視化圖件等;本文主要在python3.10環(huán)境下,利用 matplotlib.pyplot、scipy.interpolate、numpy、pandas實(shí)現(xiàn)數(shù)據(jù)的處理,網(wǎng)格數(shù)據(jù)的生成,各自平面圖和三維圖形的繪制,并加入自定義顏色欄。在繪圖開(kāi)始之前,需要準(zhǔn)備數(shù)據(jù),一般包括讀取和準(zhǔn)備數(shù)據(jù),以及簡(jiǎn)單的數(shù)據(jù)處理過(guò)濾等,后續(xù)會(huì)在此基礎(chǔ)上進(jìn)行繪圖操作或繼續(xù)進(jìn)行數(shù)據(jù)處理及可視化等。
準(zhǔn)備數(shù)據(jù)階段
# 準(zhǔn)備數(shù)據(jù) 讀取數(shù)據(jù) # 0.讀寫(xiě)實(shí)際數(shù)據(jù)生成三維曲面,數(shù)據(jù)格式為x y z filename=r'D:\project\PythonProject\ECL\data\geochemical-data\2018_T28.txt' dataTop = pd.read_csv(filename, sep='\t', header=None, names=['x', 'y', 'z']) # 去掉無(wú)效數(shù)據(jù),一般為-99999.0000 data = dataTop[dataTop['z'] != -99999.0000] x = data.iloc[:, 0] y = data.iloc[:, 1] z = data.iloc[:, 2]*(-1) #深度值是負(fù)數(shù),要取反。 xi = np.linspace(min(x), max(x)) yi = np.linspace(min(y), max(y)) xi, yi = np.meshgrid(xi, yi) # 將一維數(shù)據(jù)處理為二維的網(wǎng)格數(shù)據(jù) zi = griddata(data.iloc[:,0:2], z, (xi, yi), method='cubic') # 用法詳見(jiàn)附錄1
2018_T28.txt文件內(nèi)容
讀取后的數(shù)據(jù)樣式,xyz的shape形狀,都是相同長(zhǎng)度的一維數(shù)組,即(12766,) (12766,) (12766,).
一、利用xyz繪制三維曲面
fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.plot_trisurf(x, y, z, color='white', edgecolors='grey', alpha=0.5) #繪制三角網(wǎng)格組成的三維曲面 ax.scatter(x, y, z, c='red') # 繪制三維散點(diǎn)圖 plt.show()
利用三角網(wǎng)格繪制的三維曲面圖和三維散點(diǎn)圖
二、利用xyz生成網(wǎng)格后繪制三維曲面
fig = plt.figure() # ax = plt.axes(projection='3d') ax = fig.gca(projection='3d') surf = ax.plot_surface(xi, yi, zi, cmap='BuPu', linewidth=0, antialiased=True) #繪制三維曲面 # surf = ax.scatter(xi, yi, zi, cmap='BuPu', linewidth=0, antialiased=True) #繪制三維散點(diǎn)圖 # surf = ax.contourf(xi, yi, zi, zdim='z',offset=0.3, cmap='BuPu') #等高線面圖(contourf)或等高線圖(contour),要設(shè)置offset,為Z的最小值, fig.colorbar(surf) ax.set_title('三維圖') ax.set_zlim3d(np.min(z), np.max(z)) plt.show()
三維曲面圖、散點(diǎn)圖和等值線圖
三、利用xyz實(shí)現(xiàn)三維等值線繪制,降雨量三維等值線圖
filename = r'D:\project\PythonProject\ECL\data\geochemical-data\0.txt' # 數(shù)據(jù)文件地址,附件1 df = pd.read_csv(filename, sep="\t") # 讀取文件 df1 = df["1"] # 讀取第一列數(shù)據(jù) df2 = df['2'] # 讀取第二列數(shù)據(jù) df3 = df['3'] # 讀取第三列數(shù)據(jù) odf1 = np.linspace(100, 1900, 50) # 設(shè)置網(wǎng)格經(jīng)度 odf2 = np.linspace(10, 600, 50) # 設(shè)置網(wǎng)格緯度 odf1, odf2 = np.meshgrid(odf1, odf2) # 網(wǎng)格化,生成網(wǎng)絡(luò),生成網(wǎng)格形狀是第一個(gè)維度對(duì)應(yīng)odf1,第二個(gè)維度對(duì)應(yīng)odf2 func = Rbf(df1, df2,df3, function='linear') # 定義插值函數(shù)plt.cm.hot odf3_new = func(odf1, odf2) # 獲得插值后的網(wǎng)格累計(jì)降水量 fig = plt.figure(figsize=(12, 7)) ax1 = plt.axes(projection='3d') # 創(chuàng)建三維坐標(biāo)軸 ax1.plot_surface(odf1, odf2, odf3_new,alpha=0.3,cmap='rainbow') #繪制三維曲面,alpha-控制透明度,cmap-控制顏色 # 繪制z方向投影填充圖,等高線面圖,投到x-y平面,offset為z最小值。 cs=plt.contourf(odf1, odf2, odf3_new,zdir='z',offset=0, levels=np.arange(odf3_new.min(), odf3_new.max(), (odf3_new.max() - odf3_new.min()) / 10), cmap='GnBu', extend='both') # 畫(huà)圖 # 繪制等高線圖 line = plt.contour(odf1, odf2, odf3_new,zdir='z',offset=0,cmap="rainbow",levels=np.arange(odf3_new.min(), odf3_new.max(), (odf3_new.max() - odf3_new.min()) / 10)) plt.clabel(line, inline=True, fontsize=12) ax1.set_title('降雨量三維等值線圖') plt.colorbar(cs) plt.show()
效果圖和數(shù)據(jù)格式
四、繪制二維等值線
# 繪制二維等值線 levels = np.linspace(np.min(z), np.max(z), 50) fig, ax = plt.subplots(figsize=(8, 6)) # # 1.設(shè)置顏色條 第一種方式 # print(cm.colors.cnames) # 默認(rèn)顏色標(biāo)如 jet,coolwarm,gnuplot2_r,RdBu_r,PuBuGn_r,ocean_r,輸入的顏色名稱(chēng)錯(cuò)誤時(shí),會(huì)自動(dòng)輸出色標(biāo)的列表 cmap = cm.get_cmap('seismic_r') # cmap = cm.get_cmap('jet', 10) # 將色條分成10截 norm = cm.colors.Normalize(vmin=np.min(z), vmax=np.max(z)) # 設(shè)置色條表示的數(shù)值范圍 im1 = cm.ScalarMappable(norm=norm, cmap=cmap) # 設(shè)置映射很重要 # # 繪制顏色條(left, bottom, width, height)--表示figure的百分比,從figure 從橫向92%,縱向10%的位置開(kāi)始繪制, 寬是figure的3%,高是figure的78%, ax9 = fig.add_axes([0.92, 0.1, 0.03, 0.78]) cb = plt.colorbar(im1, cax=ax9, orientation='vertical', extend='neither') #縱向繪制,兩端無(wú)箭頭 # ticks與norm對(duì)應(yīng) # # cb = plt.colorbar(im1, cax=ax9, orientation='horizontal', extend='max', ticks=np.linspace(1900,2600, 51)) # cs = ax.contour(xi, yi, zi, levels=levels, cmap=cmap) # 不存在顏色間隔分段,并指定顏色條 # cs = ax.contour(xi, yi, zi, levels=levels,cmap='coolwarm') # 存在顏色間隔分段 cs = ax.contourf(xi, yi, zi, levels=levels,cmap='jet',extend='neither') # 等值線填充 ax.clabel(cs, inline=True, fontsize=6) ax.set_title('等高線圖') plt.show() # # 2.設(shè)置顏色條 第二種方式 # cs = ax.contourf(xi, yi, zi, levels=levels, cmap='jet', extend='neither') # 等值線填充,存在顏色間隔分段 # # ax.clabel(cs, inline=True, fontsize=6) # ax.set_title('等高線圖') # plt.colorbar(cs) # plt.show()
兩種二維等值線圖
五、繪制矢量流線圖
# 1.矢量場(chǎng)流線圖 樣例 # 0:5表示數(shù)組中數(shù)值所在的區(qū)間。100j表示劃分的密度,值越大,圖片越清晰 Y1, X1 = np.mgrid[-5:5:1000j, -5:5:10j] # (X,Y)是一維numpy數(shù)組的等距網(wǎng)格,(U,V)參數(shù)匹配的是(X,Y)速率的二維numpy數(shù)組 # U,V矩陣在維度上的行數(shù)必須等于Y的長(zhǎng)度,列的數(shù)量必須匹配X的長(zhǎng)度 U = -1 - X1 ** 2 + Y1 V = 1 + X1 - Y1 ** 2 # 可視化矢量場(chǎng) # 矢量場(chǎng)中的種子點(diǎn)坐標(biāo) seed_points = np.array([[-2, -1, 0, 1, 2, -1], [-2, -1, 0, 1, 2, 2]]) # 種子點(diǎn) # cs=plt.streamplot(X1, Y1, U, V,density=[0.5,1],color=U,cmap="autumn",linewidth=1,start_points=seed_points.T) cs = plt.streamplot(X1, Y1, U, V, color=U, cmap="Accent", linewidth=1) # plt.plot(seed_points[0], seed_points[1], "+", color="g") # 繪制折線圖,使用marker屬性標(biāo)記 plt.colorbar() plt.show() # 2.用實(shí)際數(shù)據(jù)進(jìn)行繪制,UV如何計(jì)算得到,要根據(jù)不同的目的進(jìn)行計(jì)算。 U,V=vectorComputeUV(xi,yi,zi) cs = plt.streamplot(xi, yi, U, V, color=U, cmap="Accent", linewidth=1) # cs = plt.quiver(xi, yi, U, V) plt.colorbar() plt.show() # 計(jì)算矢量場(chǎng)的速度矢量 def vectorComputeUV(xi,yi,zi): # U = np.log10((xi/10000)) - zi/1000 # V = 1 + np.log10(yi/100000) - (zi/1000) ** 3 U = -1 - (xi/10000) ** 2 + (yi/100000) V = 1 + (xi/10000) - (yi/100000) ** 2 return U,V
示例效果圖和實(shí)際數(shù)據(jù)案例圖
附錄
1.scipy.interpolate.griddata參數(shù)說(shuō)明
scipy.interpolate.griddata的參數(shù)說(shuō)明如下
插入非結(jié)構(gòu)化D-D 數(shù)據(jù)
points: 具有形狀 (n, D) 的浮點(diǎn)數(shù)的二維 ndarray,或具有形狀 (n,) 的一維 ndarray 的長(zhǎng)度 D 元組。
數(shù)據(jù)點(diǎn)坐標(biāo)。
values: 浮點(diǎn)數(shù)或復(fù)數(shù)的ndarray,形狀(n,)
數(shù)據(jù)值。
xi: 具有形狀 (m, D) 或長(zhǎng)度為 D 的 ndarray 元組的二維 ndarray 可廣播到相同形狀。
插入數(shù)據(jù)的點(diǎn)。
method: {‘linear’, ‘nearest’, ‘cubic’},可選
插值方法。之一
fill_value: 浮點(diǎn)數(shù),可選
用于填充輸入點(diǎn)凸包之外的請(qǐng)求點(diǎn)的值。如果未提供,則默認(rèn)值為 nan 。此選項(xiàng)對(duì)‘nearest’ 方法無(wú)效。
rescale: 布爾型,可選
在執(zhí)行插值之前將點(diǎn)重新縮放到單位立方體。如果某些輸入維度具有不可比較的單位并且相差許多數(shù)量級(jí),這將很有用。
返回
ndarray
插值數(shù)組。
2.streamplot()參數(shù)說(shuō)明
matplotlib.pyplot.streamplot()參數(shù)說(shuō)明如下:
x,y:表示間距均勻的網(wǎng)格數(shù)據(jù)。
u,v:表示(x, y)速率的二維數(shù)組。
density:表示流線的密度,默認(rèn)為1。
color:表示流線顏色。一般設(shè)置為U
cmap:表示線條顏色系,一般有'Accent', 'Accent_r', 'Blues', 'Blues_r', 'BrBG', 'BrBG_r', 'BuGn', 'BuGn_r', 'BuPu', 'BuPu_r', 'CMRmap', 'CMRmap_r', 'Dark2', 'Dark2_r', 'GnBu', 'GnBu_r', 'Greens'
linewidth:表示流線的寬度。
arrowsize:表示箭頭的大小。
arrowstyle:表示箭頭的類(lèi)型。
minlength:表示流線的最小長(zhǎng)度。
maxlength:表示流線的最大長(zhǎng)度。
以上就是利用python繪制二三維曲面和矢量流線圖的詳細(xì)內(nèi)容,更多關(guān)于python二三維曲面和矢量流線圖的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
selenium+python實(shí)現(xiàn)基本自動(dòng)化測(cè)試的示例代碼
這篇文章主要介紹了selenium+python實(shí)現(xiàn)基本自動(dòng)化測(cè)試的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01關(guān)于Python正則表達(dá)式 findall函數(shù)問(wèn)題詳解
在寫(xiě)正則表達(dá)式的時(shí)候總會(huì)遇到不少的問(wèn)題,本文講述了Python正則表達(dá)式中 findall()函數(shù)和多個(gè)表達(dá)式元組相遇的時(shí)候會(huì)出現(xiàn)的問(wèn)題2018-03-03Python3爬蟲(chóng)關(guān)于識(shí)別點(diǎn)觸點(diǎn)選驗(yàn)證碼的實(shí)例講解
在本篇文章里小編給大家整理了關(guān)于Python3爬蟲(chóng)關(guān)于識(shí)別點(diǎn)觸點(diǎn)選驗(yàn)證碼的實(shí)例講解內(nèi)容,需要的朋友們可以參考下。2020-07-07Python基礎(chǔ)之列表常見(jiàn)操作經(jīng)典實(shí)例詳解
這篇文章主要介紹了Python基礎(chǔ)之列表常見(jiàn)操作,結(jié)合實(shí)例形式詳細(xì)分析了Python列表創(chuàng)建方式、內(nèi)置函數(shù)與相關(guān)使用技巧,需要的朋友可以參考下2020-02-02Python基礎(chǔ)學(xué)習(xí)之類(lèi)與實(shí)例基本用法與注意事項(xiàng)詳解
這篇文章主要介紹了Python基礎(chǔ)學(xué)習(xí)之類(lèi)與實(shí)例基本用法與注意事項(xiàng),結(jié)合實(shí)例形式詳細(xì)分析了Python面相對(duì)象程序設(shè)計(jì)中關(guān)于類(lèi)的定義與實(shí)例化對(duì)象相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2019-06-06Python中Django與Echarts的結(jié)合用法圖文詳解
ECharts是一個(gè)第三方控件,下面這篇文章主要給大家介紹了關(guān)于Python中Django與Echarts的結(jié)合用法,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-10-10