牟曉東
在進(jìn)行開(kāi)源硬件編程時(shí)經(jīng)常要對(duì)獲取到的實(shí)驗(yàn)數(shù)據(jù)進(jìn)行實(shí)時(shí)或后期數(shù)據(jù)可視化分析,一般情況下我們都是在Python編程時(shí)先導(dǎo)入matplotlib模塊或Seaborn模塊,然后使用其中的pyplot、displot等子模塊與命令再結(jié)合numpy和pandas進(jìn)行各種圖表的繪制。類(lèi)似于matplotlib的底層可視化庫(kù)雖然圖表資源豐富且可定制性較強(qiáng),但作為靜態(tài)的繪圖模塊,matplotlib的書(shū)寫(xiě)代碼量較大,操作稍顯繁瑣,此時(shí)建議大家可嘗試一下能夠同時(shí)支持二維和三維作圖的Plotly,它是基于JavaScript的動(dòng)態(tài)繪圖模塊,能夠通過(guò)簡(jiǎn)單的幾行代碼就繪制出非常漂亮的圖表,便于與他人進(jìn)行共享,在此以繪制三維的點(diǎn)與線(xiàn)和函數(shù)的三維面為例進(jìn)行展示:
首先,運(yùn)行Jupyter Notebook (anaconda3),導(dǎo)入相關(guān)的模塊:“import? plotly.graph_objects as go”“import pandas as pd”;接著,通過(guò)“data = pd.read_csv('data/3d-points.csv')”對(duì)準(zhǔn)備好的csv數(shù)據(jù)文件進(jìn)行讀取加載,再通過(guò)“data.head()”進(jìn)行前五行數(shù)據(jù)的顯示——該csv文件中的數(shù)據(jù)只有X、Y和Z三列,每一行的三個(gè)數(shù)據(jù)即對(duì)應(yīng)一個(gè)三維坐標(biāo)點(diǎn),如(1,1,1)、(4,2,1)等,共300個(gè)點(diǎn);然后建立變量line,為其賦值為“go.Scatter3d(x= data['X'],y=data['Y'],z=data['Z'])”,將參數(shù)中的三維坐標(biāo)點(diǎn)與data中讀取csv文件中的各個(gè)三維坐標(biāo)點(diǎn)進(jìn)行對(duì)應(yīng);再建立變量fig,賦值為“go.Figure(line)”,最后通過(guò)“fig.show()”進(jìn)行繪圖輸出。
點(diǎn)擊“運(yùn)行”按鈕后就會(huì)看到生成了三維的點(diǎn)與線(xiàn)圖(如圖1),此時(shí)可通過(guò)鼠標(biāo)的左右上下拖動(dòng)對(duì)圖進(jìn)行各個(gè)角度的動(dòng)態(tài)展示,也可以推拉滾輪來(lái)縮放。同時(shí),在圖的右上方區(qū)域還提供了一系列小工具,實(shí)現(xiàn)圖片的保存、縮放與移動(dòng)等功能。
如果要繪制三維面的話(huà),比如想看一下某個(gè)函數(shù)在三維空間中“長(zhǎng)”什么樣子,可以先構(gòu)造出每個(gè)二維坐標(biāo)面中的均勻“點(diǎn)陣”,再將對(duì)應(yīng)的高度值進(jìn)行疊加即可。以函數(shù)“z=x的平方加y的平方”為例,仍然是在Jupyter中先導(dǎo)入模塊:“import? plotly.graph_objects as go”、“import numpy as np”;接著建立x和y兩個(gè)變量,分別為其賦值為“x = np.arange(-6,7)”“y=np.arange(-6,7)”,對(duì)應(yīng)的數(shù)據(jù)范圍是從-6到6(中間包括0)共13個(gè)整數(shù);然后,建立變量xv和yv,并同時(shí)進(jìn)行賦值:“xv,yv = np.meshgrid(x,y)”,得到兩個(gè)“矩陣”,此時(shí)可運(yùn)行代碼分別查看一下xv和yv的值;接下來(lái)再建立變量z,賦值為“xv**2 + yv**2”,即函數(shù)“z=x的平方加y的平方”的Python表達(dá)方式,此時(shí)仍然可以查看變量z的矩陣數(shù)據(jù)(如圖2)。
與繪制三維的點(diǎn)和線(xiàn)類(lèi)似,建立變量surface并進(jìn)行賦值“go.Surface(x=xv,y=yv,z=z)”,同樣是讓參數(shù)x、y和z與上面的xv、yv和z進(jìn)行三維坐標(biāo)點(diǎn)的一一對(duì)應(yīng);最后,通過(guò)“fig = go.Figure(surface)”和“fig.show()”進(jìn)行該函數(shù)的三維面顯示輸出(如圖3)。
Plotly的操作難度確實(shí)不大,而且各種圖片的顯示效果都非常不錯(cuò),大家不妨一試。