日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

3D曲面可视化

發(fā)布時(shí)間:2025/3/17 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 3D曲面可视化 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

最近需要 visualize 一些三維的曲面數(shù)據(jù),于是簡(jiǎn)單調(diào)查了一下 Python 繪制三維曲面的一些常用的辦法,貼在這里以免自己將來(lái)再需要用到的時(shí)候又想不起來(lái)了。比如我們想要畫這個(gè)樣子的 3D 曲面圖。

方便起見,我們假造一個(gè) user case,假設(shè)??和??是兩個(gè) hyper parameter,現(xiàn)在你使用 grid search 的方式嘗試了每個(gè)參數(shù)組合下的模型效果。

import numpy as npdef eval_params(x, y): # ...# Make data. X = np.arange(-5, 5, 0.25) Y = np.arange(-5, 5, 0.25)Z = np.zeros((len(X), len(Y))) for i in range(len(X)): for j in range(len(Y)): Z[i, j] = eval_params(X[i], Y[j])

現(xiàn)在我們希望把這個(gè)參數(shù)搜索的曲面畫出來(lái),看看最大值最小值、曲面的連續(xù)性之類的性質(zhì),所以我們需要畫一個(gè) 3D surface 圖。比較新版本的 Matplotlib 其實(shí)已經(jīng)有挺好的 3D 繪圖支持。上面的示例圖其實(shí)就是在 Matplotlib 里畫的。

import matplotlib from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt from matplotlib import cmfig = plt.figure() ax = fig.gca(projection='3d')XX, YY = np.meshgrid(X, Y)# Plot the surface. surf = ax.plot_surface(XX, YY, Z, cmap=cm.coolwarm, linewidth=0, antialiased=True)# Add a color bar which maps values to colors. fig.colorbar(surf, shrink=0.5, aspect=5)plt.savefig('surface.pdf')

其中?import Axes3D?那句雖然沒有直接用到,但是如果刪掉的話在創(chuàng)建 3D projection 的 axes 的時(shí)候就會(huì)出錯(cuò)。plot_surface?這個(gè)函數(shù)負(fù)責(zé)繪制 3D surface,參數(shù)相當(dāng) straightforward。因?yàn)?Z?作為我們 evaluate 參數(shù)的結(jié)果是一個(gè)二維的矩陣,所以?plot_surface?需要的前兩個(gè)參數(shù)也是二維矩陣,并且需要是和?Z?大小相同。

簡(jiǎn)單來(lái)說,對(duì)于一組 index?(i, j),XX[i, j],?YY[i, j]?和?Z[i, j]?一起給出了一個(gè)位于曲面上的點(diǎn)的三維坐標(biāo)。而?meshgrid?這個(gè)函數(shù)就是用于方便地根據(jù)原來(lái)的?X?和?Y?來(lái)創(chuàng)建這樣的二維矩陣的。

到這里我們的目標(biāo)其實(shí)已經(jīng)達(dá)到了。如果把上面的?savefig?換成?plt.show()的話,會(huì)彈出一個(gè)對(duì)話框來(lái)顯示 3D 曲面圖,好處在于可以對(duì)曲面進(jìn)行旋轉(zhuǎn)、縮放等交互操作,有時(shí)候?qū)τ诳吹角姹粨踝〉牟糠謥?lái)說非常有用。不過 Matplotlib 的 3D 操作交互反應(yīng)速度相當(dāng)緩慢,可能是沒有用任何硬件加速之類的簡(jiǎn)單實(shí)現(xiàn)吧。如果你不能忍受那個(gè)緩慢的交互速度,或者需要將生成出來(lái)的圖片發(fā)給別人看,而對(duì)方又不一定是能運(yùn)行 Python 代碼的,那還有一個(gè)選擇就是生成內(nèi)嵌 3D 對(duì)象的 PDF 文件。PDF 文件可以通過?PRC?格式內(nèi)嵌 3D 圖像模型,不過目前只有 Adobe 家的閱讀器(比如 Adobe Reader 或者 Adobe Acrobat)可以查看這種格式的對(duì)象。在 Acrobat 里打開大概長(zhǎng)下面這個(gè)樣子,可以對(duì) 3D 曲面進(jìn)行各種操作和檢查。

不過 Matplotlib 本身似乎并不支持直接輸出這種內(nèi)嵌 3D 對(duì)象的 PDF 文件。這里我們可以借助另外一個(gè)叫做?Asymptote?的繪圖工具。它其實(shí)是一種繪圖語(yǔ)言,和 LaTeX 結(jié)合得比較緊密,但是和?PGF/TikZ?或者是?PSTricks?不一樣的是,它并不是實(shí)現(xiàn)為 TeX 的宏包,所以它的語(yǔ)法并不是一些看起來(lái)像英語(yǔ)一樣的很飄逸但是一不小心就會(huì)語(yǔ)法錯(cuò)誤的?DSL,而是有點(diǎn)類似于 C 語(yǔ)言語(yǔ)法。很多年前用它畫過一些 3D 的 vector field 之類的圖,感覺比較適合畫一些復(fù)雜的 scientific 的 illustration,可以看一下它的示例。

當(dāng)然我一般不會(huì)用它來(lái) plot 數(shù)據(jù)圖,不過這里可以借用一下的是它能輸出內(nèi)嵌 3D 對(duì)象的 PDF 文件的功能。Asymptote 畫圖的簡(jiǎn)單流程是創(chuàng)建一個(gè)?foo.asy?文件,把命令寫在里面,然后執(zhí)行

asy -f pdf -o foo.pdf foo.asy

就可以了。Asymptote 里構(gòu)建一個(gè) 3D surface 可以通過一個(gè)叫做?surface?的命令來(lái)實(shí)現(xiàn),它的第一個(gè)參數(shù)是一個(gè)描述 surface 的函數(shù):輸入是??兩個(gè) index,輸出是一個(gè)三維坐標(biāo)?。這個(gè)比較適合畫一些 parametric function,不過這里我們是直接 plot 數(shù)據(jù),其實(shí)只要做一個(gè)簡(jiǎn)單的矩陣查表函數(shù)就可以了。Asymptote 里最簡(jiǎn)單的讀取數(shù)據(jù)的方法是讀入空白分隔的文本文件,打開文件之后只要對(duì)一個(gè)數(shù)組或者矩陣進(jìn)行賦值就可以讀入一行或者一塊數(shù)據(jù):

import graph3; import palette;size3(150, IgnoreAspect);// Open the data file file in=input("data.txt").line(); // read file by assignment // this read a line of numbers as an array real[] x=in; // first line real[] y=in; // second line// read the rest of the file as a matrix // 0, 0 means do not restrict the number of // elements to read in either dimension real[][] z=in.dimension(0,0);triple f(pair t) { int i = round(t.x); int j = round(t.y); return (x[i], y[j], z[i][j]); }

數(shù)據(jù)文件格式非常簡(jiǎn)單,頭兩行分別是兩個(gè)參數(shù)??和??的值列表,然后剩下的行是整個(gè)數(shù)據(jù)矩陣??的一個(gè)表格。通過 Numpy 的?savetxt?函數(shù)很容易導(dǎo)出。在 Asymptote 里讀入數(shù)據(jù)之后我們就可以構(gòu)造查表函數(shù)??了,從上面可以看到??只是直接通過下標(biāo)取得相應(yīng)的坐標(biāo)而已。接下來(lái)就可以直接構(gòu)造 surface 并進(jìn)行繪制了:

surface s = surface(f, (0,0), (x.length-1, y.length-1), x.length-1, y.length-1); s.colors(palette(s.map(zpart), Rainbow()));draw(s, meshpen=blue);triple m=currentpicture.userMin(); triple M=currentpicture.userMax(); triple target=0.5*(m+M); currentprojection=perspective(camera=target+realmult(dir(60,210),M-m), target=target);xaxis3(Label("$\lambda_1$",position=MidPoint,align=-Y-Z), Bounds(),blue,OutTicks(Step=0.25,step=0.05)); //Bounds(),blue,OutTicks(Label(align=-Y-X))); yaxis3(Label("$\lambda_2$",position=MidPoint,align=-5X), Bounds(),red,OutTicks(Step=0.25,step=0.05)); zaxis3("Error",Bounds(),black,OutTicks(Step=0.25,step=0.05));

代碼非常直接,唯一需要簡(jiǎn)單注意一下的是我們?cè)谡{(diào)用?surface?函數(shù)的時(shí)候,傳遞了參數(shù)?(0,0)?和?(x.length-1, y.length-1),這里對(duì)應(yīng)??在查表時(shí)的輸入序列。

這樣就大功告成了,當(dāng)然缺點(diǎn)就是 Adobe 家族以外的 PDF 閱讀器都看不了。第三個(gè)對(duì)于 viewer 來(lái)說比較 user friendly 的選項(xiàng)就是通過 web 頁(yè)面。現(xiàn)在在 webGL 之類的技術(shù)支持下,其實(shí) web 頁(yè)面里渲染 3D 對(duì)象的效果其實(shí)已經(jīng)非常好了。

比如之前在網(wǎng)上看到這個(gè) 3D 的卡通畫,簡(jiǎn)直太驚艷了,我覺得現(xiàn)在的各種 3D 游戲之類的都處于嚴(yán)重的?Uncanny Valley?之中,讓我非常難以接受,相反若是做成這種風(fēng)格,應(yīng)該會(huì)(讓我覺得)賞心悅目很多。然而雖然看起來(lái)只是簡(jiǎn)單的 line drawing 的結(jié)果,但是實(shí)際的制作過程還是要進(jìn)行正兒八經(jīng)的三維建模、渲染之類的,作者在這里給了制作過程介紹,看起來(lái)似乎還是相當(dāng)費(fèi)力的。另外還有這里也有一些非常漂亮的 3D 線條漫畫,看起來(lái)都非常酷,而且都是直接在瀏覽器了渲染出來(lái)的,不需要額外安裝什么很復(fù)雜的 viewer 。

就我所知范圍,目前的繪圖工具中似乎?plotly?算是對(duì) webgl 支持比較好并且也簡(jiǎn)單易用的。它們的 3D 圖大概長(zhǎng)下面這個(gè)樣子,這里有一個(gè)在線的例子可以直接進(jìn)行交互,渲染和交互效果都挺好的。

例如直接用我們剛才的 Python 里的數(shù)據(jù)的話,用下面的代碼可以直接生成 plotly 的圖,結(jié)果保持成一個(gè) HTML 文件。文件里內(nèi)嵌的 viewer,應(yīng)該用任意一個(gè)現(xiàn)代一點(diǎn)的瀏覽器都能打開預(yù)覽和交互。

import plotly import plotly.graph_objs as godata = [go.Surface(z=Z, x=XX, y=YY)] layout = go.Layout(title='Test Plot', autosize=True) fig = go.Figure(data=data, layout=layout)# save offline standalone HTML files plotly.offline.plot(fig, filename='test-plot')

唯一的缺點(diǎn)可能就是由于內(nèi)嵌的 viewer,所以 HTML 文件還是比較大的,一個(gè)簡(jiǎn)單的 surface plot 大概也需要 2M 左右。另外 plotly 還能內(nèi)嵌在 Jupyter Notebook 里預(yù)覽交互圖,它還提供收費(fèi)的云服務(wù)可以在服務(wù)器上 host 你的 figure。

感覺以后的科技論文格式應(yīng)該允許更多的交互內(nèi)容,嵌入視頻、音頻、交互圖表之類的,還有更全的 meta data,圖表、公式、引用的預(yù)覽、跳轉(zhuǎn)等等。然而現(xiàn)實(shí)是目前很多地方還會(huì)要求 plot 必須是在黑白打印的情況下也能分辨的。

總結(jié)

以上是生活随笔為你收集整理的3D曲面可视化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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