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

如果要繪制三維面的話,比如想看一下某個函數(shù)在三維空間中“長”什么樣子,可以先構(gòu)造出每個二維坐標(biāo)面中的均勻“點陣”,再將對應(yīng)的高度值進(jìn)行疊加即可。以函數(shù)“z=x的平方加y的平方”為例,仍然是在Jupyter中先導(dǎo)入模塊:“import? plotly.graph_objects as go”、“import numpy as np”;接著建立x和y兩個變量,分別為其賦值為“x = np.arange(-6,7)”“y=np.arange(-6,7)”,對應(yīng)的數(shù)據(jù)范圍是從-6到6(中間包括0)共13個整數(shù);然后,建立變量xv和yv,并同時進(jìn)行賦值:“xv,yv = np.meshgrid(x,y)”,得到兩個“矩陣”,此時可運行代碼分別查看一下xv和yv的值;接下來再建立變量z,賦值為“xv**2 + yv**2”,即函數(shù)“z=x的平方加y的平方”的Python表達(dá)方式,此時仍然可以查看變量z的矩陣數(shù)據(jù)(如圖2)。

與繪制三維的點和線類似,建立變量surface并進(jìn)行賦值“go.Surface(x=xv,y=yv,z=z)”,同樣是讓參數(shù)x、y和z與上面的xv、yv和z進(jìn)行三維坐標(biāo)點的一一對應(yīng);最后,通過“fig = go.Figure(surface)”和“fig.show()”進(jìn)行該函數(shù)的三維面顯示輸出(如圖3)。

Plotly的操作難度確實不大,而且各種圖片的顯示效果都非常不錯,大家不妨一試。