1. 程式人生 > >Linux 上的資料視覺化工具

Linux 上的資料視覺化工具

在本文中,將對很多流行的 Linux 資料視覺化工具進行一下調查,並對其中一些工具進行更深入的探討。例如,某個工具是否為進行數值計算而提供了一種語言?這個工具是互動式的還是提供了一種批處理模式來單獨進行操作?可以使用這個工具進行影象或數字訊號處理嗎?這個工具是否提供了語言繫結來支援與使用者應用程式的整合(例如 Python、Tcl、Java 程式語言等)?另外還將展示一些工具的圖形化處理能力。最後,將分析每個工具的長處,從而幫助我們確定哪個工具最適合完成計算任務或資料視覺化。

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

  • Gnuplot(GPL)
  • GNU Octave(GPL)
  • Scilab(Scilab)
  • MayaVi(BSD)
  • Maxima(GPL)

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 函式圖
set samples 25
set isosamples 26
set title "Test 3D gnuplot"
set contour base
set hidden3d offset 1
splot [-12:12.01] [-12:12.01] sin(sqrt(x**2+y**2))/sqrt(x**2+y**2)

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


圖 1. gnuplot 的一個簡單繪圖
gnuplot 的一個簡單繪圖

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


清單 2. gnuplot 的示例資料檔案(data.dat)
88 99
79 98
76 89
60 85
...
60 22

如果希望在兩維空間中繪製這些資料,並將每個資料點使用一條線連線起來,就可以使用清單 3 給出的 gnuplot 指令碼。


清單 3. 對清單 2 中的資料進行繪圖所使用的 Gnuplot 指令碼
set title "Sample data plot"
plot 'data.dat' using 1:2 t 'data points', \
  "data.dat" using 1:2 t "lines" with lines

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


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

Gnuplot 是一個很好的視覺化工具,它非常出名,是很多 GNU/Linux 發行版的一部分。然而,如果希望進行基本的資料視覺化和數值計算,那麼 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
GNU Octave, version 2.1.50 
Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 John W. Eaton.
This is free software; see the source code for copying conditions.
There is ABSOLUTELY NO WARRANTY; not even for MERCHANTIBILITY or
FITNESS FOR A PARTICULAR PURPOSE.  For details, type `warranty'.

Please contribute if you find this software useful.
For more information, visit http://www.octave.org/help-wanted.html

Report bugs to <bug-octave&bevo.che.wisc.edu>.

>> function y = lorenz( x, t )
y = [10 * (x(2) - x(1));
x(1) * (28 - x(3));
x(1) * x(2) - 8/3 * x(3)];
endfunction
>> x = lsode("lorenz", [3;15;1], (0:0.01:25)');
>> gset parametric
>> gsplot x
>>

圖 3 給出的圖是清單 4 中 Octave 程式碼的輸出結果。


圖 3. 使用 Octave 繪製的 Lorentz 圖
使用 Octave 繪製的 Lorentz 圖

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


清單 5. 在 Octave 中生成多個圖形
>> multiplot(2,2)
>> subwindow(1,1)
>> t=0:0.1:6.0
>> plot(t, cos(t))
>> subwindow(1,2)
>> plot(t, sin(t))
>> subwindow(2,1)
>> plot(t, tan(t))
>> subwindow(2,2)
>> plot(t, tanh(t))

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


圖 4. 使用 GNU Octave 繪製多圖
使用 GNU Octave 繪製多圖

我們可以認為 Octave 是一種使用 gnuplot 作為後臺實現來進行視覺化的高階語言。它提供了豐富的數學庫,是 Matlab 的一個很好的免費替換產品。可以很容易利用使用者開發的用來進行語音處理、優化、符號計算等的包對它進行擴充套件。Octave 在某些 GNU/Linux 的發行版中都有,例如 Debian,也可以在使用 Cygwin 的 Windows 和 Mac OS X 上使用。有關 Octave 的更多資訊請參閱 參考資料 一節的內容。

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 進行互動
與 Scilab 進行互動

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


圖 6. 圖 5 中的命令所生成的 Scilab 圖
圖 5 中的命令所生成的 Scilab 圖

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

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

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


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

Scilab 和 Octave 非常類似。它們都具有很大的社群參與基礎。Scilab 是使用 Fortran 77 編寫的,而 Octave 則是使用 C++ 編寫的。Octave 使用 gnuplot 來實現視覺化;Scilab 則提供了自己的庫。如果非常熟悉 Matlab,那麼 Octave 就是一個很好的選擇,因為它努力實現了與 Matlab 的相容性。Scilab 包括了很多數學函式,因此非常適合進行訊號處理。如果仍然不確定要使用哪個工具,可以全部嘗試一下。它們都是很好的工具,可以使用它們來完成不同的任務。

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 掃描圖)
使用 MayaVi/VTK 顯示的 3-D 視覺化(心臟 CT 掃描圖)

MayaVi 是在 Python 指令碼語言中擴充套件 VTK 的一個有趣例子。

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 進行互動
與 Maxima 進行互動

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


圖 10. 圖 9 的命令所生成的 Maxima 圖形
圖 9 的命令所生成的 Maxima 圖形

展望

在本文中介紹了幾個開放原始碼 GNU/Linux 視覺化工具。其他有用的工具還包括 Gri、PGPLOT、SciGraphica、plotutils、NCAR Graphics 和 ImLib3D。這些都是開放原始碼的,也就是說您可以看到它們是如何工作的;如果願意,也可以對它們進行修改。另外,如果您正在尋找一個很好的圖形模擬環境,那就請檢視一下與 OpenGL 一起使用的 Open Dynamics Engine(ODE)。

具體的需要決定了哪種工具最適合使用。如果希望使用一個具有很多視覺化演算法的強大的視覺化系統,那麼 MayaVi 就是所要尋找的工具。對於具有視覺化功能的數值計算來說,GNU Octave 和 Scilab 都非常適合。如果需要符號計算能力,那麼 Maxima 就是一個非常好的選擇。最後(但並非不重要),如果所需要的只是一些基本的繪圖功能,那麼 gnuplot 就可以很好地滿足這一需求。