你會(huì)用嗎?Linux五大數(shù)據(jù)可視化工具
可視化工具的簡(jiǎn)短列表
在本文中,將對(duì)很多流行的 Linux 數(shù)據(jù)可視化工具進(jìn)行一下調(diào)查,并對(duì)其中一些工具進(jìn)行更深入的探討。例如,某個(gè)工具是否為進(jìn)行數(shù)值計(jì)算而提供了一種語(yǔ)言?這個(gè)工具是交互式的還是提供了一種批處理模式來(lái)單獨(dú)進(jìn)行操作?可以使用這個(gè)工具進(jìn)行圖像或數(shù)字信號(hào)處理嗎?這個(gè)工具是否提供了語(yǔ)言綁定來(lái)支持與用戶應(yīng)用程序的集成(例如 Python、Tcl、Java 編程語(yǔ)言等)?另外還將展示一些工具的圖形化處理能力。***,將分析每個(gè)工具的長(zhǎng)處,從而幫助我們確定哪個(gè)工具最適合完成計(jì)算任務(wù)或數(shù)據(jù)可視化。
在本文中所探索的開(kāi)放源碼工具包括(同時(shí)還給出了每個(gè)工具所使用的許可證):
Gnuplot
Gnuplot 是一個(gè)非常好的可視化工具,它從 1986 年開(kāi)始就存在了。如果沒(méi)有 gnuplot 的圖,就很難閱讀論文。盡管 gnuplot 是命令行驅(qū)動(dòng)的,但是它也在不斷發(fā)展,現(xiàn)在也可以支持很多非交互式的應(yīng)用程序了,例如它可以作為一個(gè) GNU Octave 的繪圖引擎使用。
gnuplot 具有很好的可移植性,可以在 UNIX®、Microsoft® Windows®、 Mac OS® X 和很多其他平臺(tái)上運(yùn)行。它可以支持從 postscript 到新近的 PNG 等極為廣泛的輸出格式。
gnuplot 可以以批處理模式進(jìn)行操作,提供了一個(gè)命令腳本來(lái)生成一個(gè)圖形,也是以非交互式模式來(lái)運(yùn)行的,這讓我們可以嘗試一下它的特性來(lái)了解它們繪圖的效果。
在 gnuplot 中有一個(gè)對(duì)應(yīng)于 UNIX 的數(shù)學(xué)庫(kù)的標(biāo)準(zhǔn)的數(shù)學(xué)庫(kù)可以使用。函數(shù)的參數(shù)支持整型、實(shí)型和復(fù)型。可以將數(shù)學(xué)庫(kù)配置成弧度或角度(默認(rèn)為弧度)。
為了進(jìn)行繪圖,gnuplot 可以使用 plot 命令生成 2-D 圖形,或使用 splot 命令生成 3-D 圖形(作為 2-D projection)。使用 plot 命令,gnuplot 可以在直角二維坐標(biāo)系中進(jìn)行操作。splot 命令默認(rèn)使用的是笛卡兒坐標(biāo)系,不過(guò)也可以支持球面或柱面坐標(biāo)系。也可以在圖形中繪制等高線(如下面的圖 1 所示)。有一種新風(fēng)格的繪圖 pm3d 可以支持繪制使用調(diào)色板進(jìn)行映射的 3-D 和 4D 數(shù)據(jù)作為地圖或地表圖來(lái)使用。
下面是一個(gè)簡(jiǎn)單的 gnuplot 例子,它給出了一個(gè)具有等高線和隱線消除的 3-D 圖形。清單 1 給出了所使用的 gnuplot 命令,圖 1 給出了所生成的圖形結(jié)果。
清單 1. 簡(jiǎn)單的 gnuplot 函數(shù)圖
清單 1 充分顯示了 gnuplot 的命令集是多么簡(jiǎn)單。采樣速度和繪圖密度是由 samples 和 isosamples 決定的,標(biāo)題是由 title 參數(shù)為圖形提供的。同時(shí)還啟用了基本的等高線和隱線消除特性,最終的繪圖是利用 splot 命令使用數(shù)學(xué)庫(kù)內(nèi)部的函數(shù)來(lái)創(chuàng)建的。結(jié)果如圖 1 所示。
圖 1. gnuplot 的一個(gè)簡(jiǎn)單繪圖
除了創(chuàng)建函數(shù)圖之外,gnuplot 還可以很好地對(duì)文件中包含的圖形進(jìn)行繪圖??紤]如清單 2 所示的 x/y 數(shù)據(jù)對(duì)(這個(gè)文件的一個(gè)簡(jiǎn)短版本)。這個(gè)文件中給出的數(shù)據(jù)對(duì)表示一個(gè)兩維空間中的 x 和 y 軸的數(shù)據(jù)。
清單 2. gnuplot 的示例數(shù)據(jù)文件(data.dat)
如果希望在兩維空間中繪制這些數(shù)據(jù),并將每個(gè)數(shù)據(jù)點(diǎn)使用一條線連接起來(lái),就可以使用清單 3 給出的 gnuplot 腳本。
清單 3. 對(duì)清單 2 中的數(shù)據(jù)進(jìn)行繪圖所使用的 Gnuplot 腳本
結(jié)果如圖 2 所示。注意 gnuplot 自動(dòng)給出了軸的刻度,但是如果需要標(biāo)注圖形的位置,就可以對(duì)其進(jìn)行控制。
圖 2. 在 gnuplot 中使用數(shù)據(jù)文件進(jìn)行簡(jiǎn)單的繪圖
Gnuplot 是一個(gè)很好的可視化工具,它非常出名,是很多 GNU/Linux 發(fā)行版的一部分。然而,如果希望進(jìn)行基本的數(shù)據(jù)可視化和數(shù)值計(jì)算,那么 GNU Octave 可能是我們希望尋找的工具。
#p#
GNU Octave
GNU Octave 是一種高級(jí)語(yǔ)言,主要設(shè)計(jì)用來(lái)進(jìn)行數(shù)值計(jì)算,它是 MathWorks 出品的 Matlab 商業(yè)軟件的一個(gè)強(qiáng)有力的競(jìng)爭(zhēng)產(chǎn)品。除了 gnuplot 所提供的簡(jiǎn)單命令集之外,Octave 還為進(jìn)行數(shù)學(xué)編程提供了一種豐富的語(yǔ)言。我們甚至可以使用 C 或 C++ 語(yǔ)言編寫(xiě)自己的應(yīng)用程序,然后與 Octave 進(jìn)行交互。
Octave 最初是在 1992 年作為化學(xué)反應(yīng)堆設(shè)計(jì)教科書(shū)的一個(gè)輔助軟件而編寫(xiě)的。其作者希望能夠幫助學(xué)生解決反應(yīng)堆的設(shè)計(jì)問(wèn)題,而不用調(diào)試 Fortran 程序。結(jié)果獲得了一種非常有用的語(yǔ)言,并為解決數(shù)值問(wèn)題提供了交互式環(huán)境。
Octave 可以以一種腳本化模式非交互地進(jìn)行操作,或者通過(guò) C 和 C++ 語(yǔ)言綁定進(jìn)行操作。Octave 本身就有一種非常豐富的語(yǔ)言,該語(yǔ)言看起來(lái)與 C 語(yǔ)言非常類(lèi)似,并有一個(gè)很大的數(shù)學(xué)庫(kù),包括信號(hào)和圖像處理、音頻處理以及控制理論所使用的一些特殊函數(shù)。
由于 Octave 使用了 gnuplot 作為其后端實(shí)現(xiàn),因此使用 gnuplot 可以繪制的所有東西都可以使用 Octave 進(jìn)行繪制。Octave 的確有一種更豐富的語(yǔ)言來(lái)進(jìn)行計(jì)算,它有很多明顯的優(yōu)點(diǎn),但是仍然有 gnuplot 的一些限制。
在下面這個(gè) Octave-Forge Web 站點(diǎn)上提供的例子中(SimpleExamples),繪制了一個(gè) Lorentz Strange Attractor。清單 4 給出了在使用 Cygwin 的 Windows 平臺(tái)上 Octave 所使用的交互式對(duì)話框。這個(gè)例子展示了 lsode 的用法,這是一個(gè)常見(jiàn)的微分方程解算器。
清單 4. 使用 Octave 呈現(xiàn) Lorentz Strange Attractor
圖 3 給出的圖是清單 4 中 Octave 代碼的輸出結(jié)果。
圖 3. 使用 Octave 繪制的 Lorentz 圖
GNU Octave(與 gnuplot 一致)可以使用 multiplot 特性在一個(gè)頁(yè)面上呈現(xiàn)多個(gè)圖形。使用這個(gè)特性,就可以定義要?jiǎng)?chuàng)建多少圖形,然后使用subwindow 命令來(lái)定制特定的圖形。在定義好子窗口之后,就可以正常地生成自己的圖形,然后再跳到下一個(gè)子窗口中(如清單 5 所示)。
清單 5. 在 Octave 中生成多個(gè)圖形
所生成的多圖頁(yè)面如圖 4 所示。這是將相關(guān)圖形搜集在一起進(jìn)行比較和對(duì)比的一種很好的特性。
圖 4. 使用 GNU Octave 繪制多圖
我們可以認(rèn)為 Octave 是一種使用 gnuplot 作為后臺(tái)實(shí)現(xiàn)來(lái)進(jìn)行可視化的高級(jí)語(yǔ)言。它提供了豐富的數(shù)學(xué)庫(kù),是 Matlab 的一個(gè)很好的免費(fèi)替換產(chǎn)品??梢院苋菀桌糜脩糸_(kāi)發(fā)的用來(lái)進(jìn)行語(yǔ)音處理、優(yōu)化、符號(hào)計(jì)算等的包對(duì)它進(jìn)行擴(kuò)展。Octave 在某些 GNU/Linux 的發(fā)行版中都有,例如 Debian,也可以在使用 Cygwin 的 Windows 和 Mac OS X 上使用。
Scilab
Scilab 在啟用數(shù)值計(jì)算和可視化方面都與 GNU Octave 非常類(lèi)似。 Scilab 是世界上廣泛存在的工程和科學(xué)應(yīng)用程序所使用的一種解釋器和高級(jí)語(yǔ)言。
Scilab 誕生于 1994 年,它是由法國(guó)的 INRIA(Institut national de recherche en informatique et en automatique)和 ENPC(École Nationale des Ponts et Chaussées)設(shè)計(jì)的。從 2003 年開(kāi)始 Scilab 開(kāi)始由 Scilab Consortium 進(jìn)行維護(hù)。
Scilab 包括一個(gè)很大的數(shù)學(xué)函數(shù)庫(kù),可以利用使用 C 和 Fortran 之類(lèi)的高級(jí)語(yǔ)言編寫(xiě)的程序進(jìn)行擴(kuò)充。它還有重載數(shù)據(jù)類(lèi)型和操作的能力。它包括一個(gè)集成的高級(jí)語(yǔ)言,不過(guò)這種語(yǔ)言與 C 語(yǔ)言稍微有些區(qū)別。
Scilab 中有很多工具包提供了 2-D 和 3-D 的圖形動(dòng)畫(huà)、優(yōu)化、統(tǒng)計(jì)、圖標(biāo)和網(wǎng)絡(luò)、信號(hào)處理、混合動(dòng)態(tài)系統(tǒng)模擬和仿真以及其他許多由社區(qū)所貢獻(xiàn)的功能。
在大部分 UNIX 系統(tǒng)上都可以使用 Scilab,在較新的 Windows 操作系統(tǒng)上也可以使用。與 GNU Octave 一樣, Scilab 也有很好的文檔。由于它是一個(gè)歐洲的項(xiàng)目,因此還可以找到很多使用除英語(yǔ)之外的其他語(yǔ)言所編寫(xiě)的文檔和文章。
在啟動(dòng) Scilab 之后,就會(huì)顯示一個(gè)窗口讓我們可以與之進(jìn)行交互(如圖 5 所示)。
圖 5. 與 Scilab 進(jìn)行交互
在這個(gè)例子中,先是創(chuàng)建了一個(gè)向量(t),其值的范圍從 0 到 2PI(步進(jìn)大小為 0.2)。然后生成了一個(gè) 3-D 圖形(使用 z=f(x,y), 或者說(shuō)是 xi,yi 點(diǎn)處的一個(gè)表面)。圖 6 給出了所生成的圖形。
圖 6. 圖 5 中的命令所生成的 Scilab 圖
Scilab 中包括很多庫(kù)和函數(shù),它們可以使用最少的復(fù)雜性來(lái)繪制圖形。下面是一個(gè)生成簡(jiǎn)單三維柱狀圖的例子:
-->hist3d(5*(rand(5,5));
首先,rand(5,5) 會(huì)構(gòu)建一個(gè) 5,5 大小的矩陣,其中包含了一些隨機(jī)值(其***值為 5)。這個(gè)矩陣被傳遞給函數(shù) hist3d。所生成的柱狀圖如圖 7 所示。
圖 7. 生成隨機(jī)的三維柱狀圖
Scilab 和 Octave 非常類(lèi)似。它們都具有很大的社區(qū)參與基礎(chǔ)。Scilab 是使用 Fortran 77 編寫(xiě)的,而 Octave 則是使用 C++ 編寫(xiě)的。Octave 使用 gnuplot 來(lái)實(shí)現(xiàn)可視化;Scilab 則提供了自己的庫(kù)。如果非常熟悉 Matlab,那么 Octave 就是一個(gè)很好的選擇,因?yàn)樗?shí)現(xiàn)了與 Matlab 的兼容性。Scilab 包括了很多數(shù)學(xué)函數(shù),因此非常適合進(jìn)行信號(hào)處理。如果仍然不確定要使用哪個(gè)工具,可以全部嘗試一下。它們都是很好的工具,可以使用它們來(lái)完成不同的任務(wù)。
#p#
MayaVi
MayaVi 在梵語(yǔ)中的意思是魔術(shù)師,它是一種數(shù)據(jù)可視化工具,綁定了具有強(qiáng)大可視化工具包(VTK)的 Python 來(lái)進(jìn)行圖形化顯示。MayaVi 還提供了一個(gè)使用 Tkinter 模塊開(kāi)發(fā)的圖形用戶界面(GUI)。Tkinter 是一個(gè) Tk 界面,通常都與 Tcl 一起使用。
MayaVi 最初是為 Computational Fluid Dynamics(CFD)作為一個(gè)可視化工具而開(kāi)發(fā)的。當(dāng)人們認(rèn)識(shí)到它在其他領(lǐng)域中的效用之后,它就作為一種通用科學(xué)數(shù)據(jù)可視化工具重新進(jìn)行了設(shè)計(jì)。
MayaVi 背后的魔力來(lái)自于 VTK。VTK 是一個(gè)用來(lái)進(jìn)行數(shù)據(jù)可視化和圖像處理的開(kāi)放源碼系統(tǒng),它在科學(xué)社區(qū)中被廣泛地使用。VTK 通過(guò)為 Tcl/Tk、Java 編程語(yǔ)言以及 Python 加上 C++ 庫(kù)所提供的腳本化接口而封裝了很多功能。VTK 在很多操作系統(tǒng)上都是可移植的,包括 UNIX、Windows 和 MAC OS X。
圍繞 VTK 的 MayaVi 外殼可以作為一個(gè) Python 模塊從其他 Python 程序中導(dǎo)入,并通過(guò) Python 解釋器來(lái)編寫(xiě)腳本。MayaVi 所提供的 tkinter GUI 允許進(jìn)行過(guò)濾器的配置和應(yīng)用,以及在可視化基礎(chǔ)上渲染一些燈光效果。
圖 8 是在 Windows 平臺(tái)上使用 MayaVi 進(jìn)行可視化的一個(gè)例子。
圖 8. 使用 MayaVi/VTK 顯示的 3-D 可視化(心臟 CT 掃描圖)
MayaVi 是在 Python 腳本語(yǔ)言中擴(kuò)展 VTK 的一個(gè)有趣例子。
#p#
Maxima
Maxima 是一個(gè)符號(hào)和數(shù)值計(jì)算程序,它是 Octave 和 Scilab 的血液。Maxima 最初的開(kāi)發(fā)團(tuán)隊(duì)開(kāi)始于 19 世紀(jì) 70 年代的 MIT(麻聲理工學(xué)院),現(xiàn)在還繼續(xù)在維護(hù)。最初的版本(一個(gè)計(jì)算機(jī)代數(shù)系統(tǒng))名為 DOE Macsyma,它開(kāi)辟了后來(lái)開(kāi)發(fā)的更知名的應(yīng)用程序(例如 Mathematica)的道路。
Maxima 提供了一組所期望的功能集(例如微積分、解析線性系統(tǒng)和非線性等式集)以及符號(hào)計(jì)算能力。在 Maxima 中還可以找到 Lisp 的一些線索(從引用之類(lèi)的函數(shù)、map 和 apply 中)。Maxima 是使用 Lisp 編寫(xiě)的,可以在 Maxima 會(huì)話中執(zhí)行 Lisp 代碼。
Maxima 具有很好的在線幫助系統(tǒng),它是基于超文本的。例如,如果希望了解某個(gè)特定的 Maxima 函數(shù)是如何工作的,那么就可以簡(jiǎn)單地輸入example( desolve ),然后它會(huì)提供很多樣例用法。
Maxima 還有一些有趣的特性,例如規(guī)則和模式。這些規(guī)則和模式都是由用來(lái)簡(jiǎn)化表達(dá)式的程序所使用的。規(guī)則可以用于交換和非交換代數(shù)。
Maxima 與 Octave 和 Scilab 非常類(lèi)似:其中解釋器都可以用來(lái)與用戶進(jìn)行交互,結(jié)果都會(huì)直接在同一個(gè)窗口中提供,或者也可以在另外一個(gè)窗口中進(jìn)行顯示。在圖 9 中,請(qǐng)求繪制一個(gè)簡(jiǎn)單的 3-D 圖形。
圖 9. 與 Maxima 進(jìn)行交互
所生成的圖形如圖 10 所示。
圖 10. 圖 9 的命令所生成的 Maxima 圖形
展望
在本文中介紹了幾個(gè)開(kāi)放源碼 GNU/Linux 可視化工具。其他有用的工具還包括 Gri、PGPLOT、SciGraphica、plotutils、NCAR Graphics 和 ImLib3D。這些都是開(kāi)放源碼的,也就是說(shuō)您可以看到它們是如何工作的;如果愿意,也可以對(duì)它們進(jìn)行修改。另外,如果您正在尋找一個(gè)很好的圖形仿真環(huán)境,那就請(qǐng)查看一下與 OpenGL 一起使用的 Open Dynamics Engine(ODE)。
具體的需要決定了哪種工具最適合使用。如果希望使用一個(gè)具有很多可視化算法的強(qiáng)大的可視化系統(tǒng),那么 MayaVi 就是所要尋找的工具。對(duì)于具有可視化功能的數(shù)值計(jì)算來(lái)說(shuō),GNU Octave 和 Scilab 都非常適合。如果需要符號(hào)計(jì)算能力,那么 Maxima 就是一個(gè)非常好的選擇。***(但并非不重要),如果所需要的只是一些基本的繪圖功能,那么 gnuplot 就可以很好地滿足這一需求。