天天看點

你會用嗎?Linux五大資料可視化工具

可視化工具的簡短清單

在本文中,将對很多流行的 linux 資料可視化工具進行一下調查,并對其中一些工具進行更深入的探讨。例如,某個工具是否為進行數值計算而提供了一種語言?這個工具是互動式的還是提供了一種批處理模式來單獨進行操作?可以使用這個工具進行圖像或數字信号處理嗎?這個工具是否提供了語言綁定來支援與使用者應用程式的內建(例如 python、tcl、java 程式設計語言等)?另外還将展示一些工具的圖形化處理能力。最後,将分析每個工具的長處,進而幫助我們确定哪個工具最适合完成計算任務或資料可視化。

在本文中所探索的開放源碼工具包括(同時還給出了每個工具所使用的許可證):

gnuplot

gnuplot 是一個非常好的可視化工具,它從 1986 年開始就存在了。如果沒有 gnuplot 的圖,就很難閱讀論文。盡管 gnuplot 是指令行驅動的,但是它也在不斷發展,現在也可以支援很多非互動式的應用程式了,例如它可以作為一個 gnu octave 的繪圖引擎使用。

gnuplot 具有很好的可移植性,可以在 unix®、microsoft® windows®、 mac os® x 和很多其他平台上運作。它可以支援從 postscript 到新近的 png 等極為廣泛的輸出格式。

gnuplot 可以以批處理模式進行操作,提供了一個指令腳本來生成一個圖形,也是以非互動式模式來運作的,這讓我們可以嘗試一下它的特性來了解它們繪圖的效果。

在 gnuplot 中有一個對應于 unix 的數學庫的标準的數學庫可以使用。函數的參數支援整型、實型和複型。可以将數學庫配置成弧度或角度(預設為弧度)。

為了進行繪圖,gnuplot 可以使用 plot 指令生成 2-d 圖形,或使用 splot 指令生成 3-d 圖形(作為 2-d projection)。使用 plot 指令,gnuplot 可以在直角二維坐标系中進行操作。splot 指令預設使用的是笛卡兒坐标系,不過也可以支援球面或柱面坐标系。也可以在圖形中繪制等高線(如下面的圖 1 所示)。有一種新風格的繪圖 pm3d 可以支援繪制使用調色闆進行映射的 3-d 和 4d 資料作為地圖或地表圖來使用。

下面是一個簡單的 gnuplot 例子,它給出了一個具有等高線和隐線消除的 3-d 圖形。清單 1 給出了所使用的 gnuplot 指令,圖 1 給出了所生成的圖形結果。

清單 1. 簡單的 gnuplot 函數圖

清單 1 充分顯示了 gnuplot 的指令集是多麼簡單。采樣速度和繪圖密度是由 samples 和 isosamples 決定的,标題是由 title 參數為圖形提供的。同時還啟用了基本的等高線和隐線消除特性,最終的繪圖是利用 splot 指令使用數學庫内部的函數來建立的。結果如圖 1 所示。

圖 1. gnuplot 的一個簡單繪圖

你會用嗎?Linux五大資料可視化工具

除了建立函數圖之外,gnuplot 還可以很好地對檔案中包含的圖形進行繪圖。考慮如清單 2 所示的 x/y 資料對(這個檔案的一個簡短版本)。這個檔案中給出的資料對表示一個兩維空間中的 x 和 y 軸的資料。

清單 2. gnuplot 的示例資料檔案(data.dat)

如果希望在兩維空間中繪制這些資料,并将每個資料點使用一條線連接配接起來,就可以使用清單 3 給出的 gnuplot 腳本。

清單 3. 對清單 2 中的資料進行繪圖所使用的 gnuplot 腳本

結果如圖 2 所示。注意 gnuplot 自動給出了軸的刻度,但是如果需要标注圖形的位置,就可以對其進行控制。

圖 2. 在 gnuplot 中使用資料檔案進行簡單的繪圖

你會用嗎?Linux五大資料可視化工具

gnuplot 是一個很好的可視化工具,它非常出名,是很多 gnu/linux 發行版的一部分。然而,如果希望進行基本的資料可視化和數值計算,那麼 gnu octave 可能是我們希望尋找的工具。

gnu octave

gnu octave 是一種進階語言,主要設計用來進行數值計算,它是 mathworks 出品的 matlab 商業軟體的一個強有力的競争産品。除了 gnuplot 所提供的簡單指令集之外,octave 還為進行數學程式設計提供了一種豐富的語言。我們甚至可以使用 c 或 c++ 語言編寫自己的應用程式,然後與 octave 進行互動。

octave 最初是在 1992 年作為化學反應堆設計教科書的一個輔助軟體而編寫的。其作者希望能夠幫助學生解決反應堆的設計問題,而不用調試 fortran 程式。結果獲得了一種非常有用的語言,并為解決數值問題提供了互動式環境。

octave 可以以一種腳本化模式非互動地進行操作,或者通過 c 和 c++ 語言綁定進行操作。octave 本身就有一種非常豐富的語言,該語言看起來與 c 語言非常類似,并有一個很大的數學庫,包括信号和圖像處理、音頻處理以及控制理論所使用的一些特殊函數。

由于 octave 使用了 gnuplot 作為其後端實作,是以使用 gnuplot 可以繪制的所有東西都可以使用 octave 進行繪制。octave 的确有一種更豐富的語言來進行計算,它有很多明顯的優點,但是仍然有 gnuplot 的一些限制。

在下面這個 octave-forge web 站點上提供的例子中(simpleexamples),繪制了一個 lorentz strange attractor。清單 4 給出了在使用 cygwin 的 windows 平台上 octave 所使用的互動式對話框。這個例子展示了 lsode 的用法,這是一個常見的微分方程解算器。

清單 4. 使用 octave 呈現 lorentz strange attractor

圖 3 給出的圖是清單 4 中 octave 代碼的輸出結果。

圖 3. 使用 octave 繪制的 lorentz 圖

你會用嗎?Linux五大資料可視化工具

gnu octave(與 gnuplot 一緻)可以使用 multiplot 特性在一個頁面上呈現多個圖形。使用這個特性,就可以定義要建立多少圖形,然後使用subwindow 指令來定制特定的圖形。在定義好子視窗之後,就可以正常地生成自己的圖形,然後再跳到下一個子視窗中(如清單 5 所示)。

清單 5. 在 octave 中生成多個圖形

所生成的多圖頁面如圖 4 所示。這是将相關圖形搜集在一起進行比較和對比的一種很好的特性。

圖 4. 使用 gnu octave 繪制多圖

你會用嗎?Linux五大資料可視化工具

我們可以認為 octave 是一種使用 gnuplot 作為背景實作來進行可視化的進階語言。它提供了豐富的數學庫,是 matlab 的一個很好的免費替換産品。可以很容易利用使用者開發的用來進行語音處理、優化、符号計算等的包對它進行擴充。octave 在某些 gnu/linux 的發行版中都有,例如 debian,也可以在使用 cygwin 的 windows 和 mac os x 上使用。

scilab

scilab 在啟用數值計算和可視化方面都與 gnu octave 非常類似。 scilab 是世界上廣泛存在的工程和科學應用程式所使用的一種解釋器和進階語言。

scilab 誕生于 1994 年,它是由法國的 inria(institut national de recherche en informatique et en automatique)和 enpc(École nationale des ponts et chaussées)設計的。從 2003 年開始 scilab 開始由 scilab consortium 進行維護。

scilab 包括一個很大的數學函數庫,可以利用使用 c 和 fortran 之類的進階語言編寫的程式進行擴充。它還有重載資料類型和操作的能力。它包括一個內建的進階語言,不過這種語言與 c 語言稍微有些差別。

scilab 中有很多工具包提供了 2-d 和 3-d 的圖形動畫、優化、統計、圖示和網絡、信号處理、混合動态系統模拟和仿真以及其他許多由社群所貢獻的功能。

在大部分 unix 系統上都可以使用 scilab,在較新的 windows 作業系統上也可以使用。與 gnu octave 一樣, scilab 也有很好的文檔。由于它是一個歐洲的項目,是以還可以找到很多使用除英語之外的其他語言所編寫的文檔和文章。

在啟動 scilab 之後,就會顯示一個視窗讓我們可以與之進行互動(如圖 5 所示)。

圖 5. 與 scilab 進行互動

你會用嗎?Linux五大資料可視化工具

在這個例子中,先是建立了一個向量(t),其值的範圍從 0 到 2pi(步進大小為 0.2)。然後生成了一個 3-d 圖形(使用 z=f(x,y), 或者說是 xi,yi 點處的一個表面)。圖 6 給出了所生成的圖形。

圖 6. 圖 5 中的指令所生成的 scilab 圖

你會用嗎?Linux五大資料可視化工具

scilab 中包括很多庫和函數,它們可以使用最少的複雜性來繪制圖形。下面是一個生成簡單三維柱狀圖的例子:

-->hist3d(5*(rand(5,5));

首先,rand(5,5) 會建構一個 5,5 大小的矩陣,其中包含了一些随機值(其最大值為 5)。這個矩陣被傳遞給函數 hist3d。所生成的柱狀圖如圖 7 所示。

圖 7. 生成随機的三維柱狀圖

你會用嗎?Linux五大資料可視化工具

scilab 和 octave 非常類似。它們都具有很大的社群參與基礎。scilab 是使用 fortran 77 編寫的,而 octave 則是使用 c++ 編寫的。octave 使用 gnuplot 來實作可視化;scilab 則提供了自己的庫。如果非常熟悉 matlab,那麼 octave 就是一個很好的選擇,因為它努力實作了與 matlab 的相容性。scilab 包括了很多數學函數,是以非常适合進行信号處理。如果仍然不确定要使用哪個工具,可以全部嘗試一下。它們都是很好的工具,可以使用它們來完成不同的任務。

mayavi

mayavi 在梵語中的意思是魔術師,它是一種資料可視化工具,綁定了具有強大可視化工具包(vtk)的 python 來進行圖形化顯示。mayavi 還提供了一個使用 tkinter 子產品開發的圖形使用者界面(gui)。tkinter 是一個 tk 界面,通常都與 tcl 一起使用。

mayavi 最初是為 computational fluid dynamics(cfd)作為一個可視化工具而開發的。當人們認識到它在其他領域中的效用之後,它就作為一種通用科學資料可視化工具重新進行了設計。

mayavi 背後的魔力來自于 vtk。vtk 是一個用來進行資料可視化和圖像處理的開放源碼系統,它在科學社群中被廣泛地使用。vtk 通過為 tcl/tk、java 程式設計語言以及 python 加上 c++ 庫所提供的腳本化接口而封裝了很多功能。vtk 在很多作業系統上都是可移植的,包括 unix、windows 和 mac os x。

圍繞 vtk 的 mayavi 外殼可以作為一個 python 子產品從其他 python 程式中導入,并通過 python 解釋器來編寫腳本。mayavi 所提供的 tkinter gui 允許進行過濾器的配置和應用,以及在可視化基礎上渲染一些燈光效果。

圖 8 是在 windows 平台上使用 mayavi 進行可視化的一個例子。

圖 8. 使用 mayavi/vtk 顯示的 3-d 可視化(心髒 ct 掃描圖)

你會用嗎?Linux五大資料可視化工具

mayavi 是在 python 腳本語言中擴充 vtk 的一個有趣例子。

maxima

maxima 是一個符号和數值計算程式,它是 octave 和 scilab 的血液。maxima 最初的開發團隊開始于 19 世紀 70 年代的 mit(麻聲理工學院),現在還繼續在維護。最初的版本(一個計算機代數系統)名為 doe macsyma,它開辟了後來開發的更知名的應用程式(例如 mathematica)的道路。

maxima 提供了一組所期望的功能集(例如微積分、解析線性系統和非線性等式集)以及符号計算能力。在 maxima 中還可以找到 lisp 的一些線索(從引用之類的函數、map 和 apply 中)。maxima 是使用 lisp 編寫的,可以在 maxima 會話中執行 lisp 代碼。

maxima 具有很好的線上幫助系統,它是基于超文本的。例如,如果希望了解某個特定的 maxima 函數是如何工作的,那麼就可以簡單地輸入example( desolve ),然後它會提供很多樣例用法。

maxima 還有一些有趣的特性,例如規則和模式。這些規則和模式都是由用來簡化表達式的程式所使用的。規則可以用于交換和非交換代數。

maxima 與 octave 和 scilab 非常類似:其中解釋器都可以用來與使用者進行互動,結果都會直接在同一個視窗中提供,或者也可以在另外一個視窗中進行顯示。在圖 9 中,請求繪制一個簡單的 3-d 圖形。

圖 9. 與 maxima 進行互動

你會用嗎?Linux五大資料可視化工具

所生成的圖形如圖 10 所示。

圖 10. 圖 9 的指令所生成的 maxima 圖形

你會用嗎?Linux五大資料可視化工具

展望

在本文中介紹了幾個開放源碼 gnu/linux 可視化工具。其他有用的工具還包括 gri、pgplot、scigraphica、plotutils、ncar graphics 和 imlib3d。這些都是開放源碼的,也就是說您可以看到它們是如何工作的;如果願意,也可以對它們進行修改。另外,如果您正在尋找一個很好的圖形仿真環境,那就請檢視一下與 opengl 一起使用的 open dynamics engine(ode)。

具體的需要決定了哪種工具最适合使用。如果希望使用一個具有很多可視化算法的強大的可視化系統,那麼 mayavi 就是所要尋找的工具。對于具有可視化功能的數值計算來說,gnu octave 和 scilab 都非常适合。如果需要符号計算能力,那麼 maxima 就是一個非常好的選擇。最後(但并非不重要),如果所需要的隻是一些基本的繪圖功能,那麼 gnuplot 就可以很好地滿足這一需求。

本文作者:圖表大師

來源:51cto