수 많은 리눅스 데이터 시각화 툴을 소개하고, 각각의 기능들을 설명할 것이다. 툴이 숫자 연산용 언어를 제공하는가? 툴이 대화형인가, 아니면 배치(batch) 모드에서만 작동하는가? 이미지 또는 디지털 시그널 프로세싱에 툴을 사용할 수 있는가? 이 툴이 언어 바인딩을 제공하여 사용자 애플리케이션(Python, Tcl, Java)과의 통합을 지원하는가? 또한, 툴의 그래픽 기능도 설명하겠다. 마지막으로, 자신의 태스크와 데이터 시각화에 가장 잘 맞는 툴을 선택할 수 있도록, 각 툴의 장점을 설명하겠다.
이 글에서 설명할 오픈 소스 툴은 다음과 같다. (관련 라이센스)
- Gnuplot (Gnuplot Copyright, GPL이 아님.)
- GNU Octave (GPL)
- Scilab (Scilab)
- MayaVi (BSD)
- Maxima (GPL)
- OpenDX (IBM Public License)
Gnuplot은 1986년에 탄생한 훌륭한 시각화 툴이다. Gnuplot 그래프로 실행하지 않고는 제목이나 내용을 읽기 힘들다. Gnuplot이 명령행 위주로 되어 있지만, 첫 출발은 GNU Octave용 플롯팅(plotting) 엔진으로서 사용되는 것을 비롯하여, 많은 비 대화형 애플리케이션을 지원했다.
Gnuplot은 이식성이 있으며, UNIX®, Microsoft® Windows®, Mac OS® X, 기타 플랫폼에서 실행된다. 포스트스크립트부터 최신 PNG까지 다양한 아웃풋 포맷을 지원한다.
Gnuplot은 배치 모드에서 실행되며, 명령어 스크립트를 제공하여 플롯(plot)을 생성하고, 대화형 모드에서 역시, 이 기능을 사용하여 같은 결과를 볼 수 있다.
표준 math 라이브러리 역시 유닉스 math 라이브러리와 상응하는 Gnuplot으로 사용할 수 있다. 함수용 인자들은 정소, real, complex를 지원한다. Radian 또는 Degree용 math 라이브러리를 설정할 수 있다. (디폴트는 Radian이다.)
플롯팅의 경우, Gnuplot은 plot 명령어를 사용하여 2-D 플롯을, splot 명령어로 3-D 플롯(2-D 투영)을 만들 수 있다. plot 명령어를 사용하여, Gnuplot은 직사각 또는 극좌표로 조정할 수 있다. splot 명령어는 기본적으로 Cartesian이지만, 구형과 원통형 좌표도 지원한다. 등고선도 사용할 수 있다. (그림 1) 새로운 스타일의 플롯인 pm3d는 팔레트로 매핑된 3-D와 4-D 데이터를 지원한다.
다음은 등고선과 은선 제거(hidden line removal)를 사용하여 3-D 함수 플롯팅을 설명하는 Gnuplot 예제이다. Listing 1은 사용되는 Gnuplot 명령어이고, 그림 1은 결과 그래픽이다.
Listing 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) |
Listing 1은 Gnuplot의 명령어 세트의 단순함을 드러내고 있다. 플롯의 샘플링 비율과 밀도는 samples와 isosamples로 결정되고, title은 title 매개변수와 함께 그래프에 제공된다. base contour는 은선 제거로 실행되고, sinc plot은 내부에서 사용할 수 있는 math 라이브러리 함수를 사용하여 splot 명령어로 만들어진다. 결과는 그림 1과 같다.
그림 1. gnuplot의 플롯
함수 플롯을 만드는 것 외에도, Gnuplot은 파일에 저장된 데이터를 그리기에도 알맞다. Listing 2의 x/y 데이터 쌍을 생각해 보자. 이 파일에 있는 데이터 쌍들은 2차원 공간에서 x와 y 좌표를 나타낸다.
Listing 2. gnuplot용 샘플 데이터 파일 (data.dat)
56 48 59 29 85 20 93 16 ... 56 48 |
이 데이터를 2차원 공간에 그리고, 각 데이터 점을 라인으로 연결하려면, Listing 3과 같이 Gnuplot 스크립트를 사용한다.
Listing 3. Gnuplot 스크립트를 사용하여 Listing 2의 데이터 그리기
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은 대중적인 시각화 툴이고, 많은 GNU/Linux 배포판의 표준이다. 하지만, 기본 데이터 시각화와 숫자 계산이 필요하다면, GNU Octave가 알맞다.
GNU Octave는 고급 언어이고, 주로 숫자 계산용으로 설계되었으며, The MathWorks의 상용 Matlab 애플리케이션에 필적한다. gnuplot에서 제공되는 명령어 대신, Octave는 수치 프로그래밍(mathematical programming)에 풍부한 언어를 제공한다. 심지어는 C 또는 C++에서 애플리케이션을 작성한 다음 Octave와 인터페이싱 할 수도 있다.
Octave는 상용 리액터 디자인의 텍스트북용 보조 소프트웨어로서 1992년에 만들어졌다. 작성자는 Fortran 프로그램을 디버깅 하는 것이 아닌, 학생들에게 리액터 디자인 문제를 설명하고자 했다. 결과적으로, 숫자 문제를 해결하는데 유용한 인터랙티브 환경이 되었다.
Octave는 스크립트 모드, 대화식, C와 C++ 언어 바인딩으로 작동할 수 있다. Octave는 C와 비슷한 풍부한 언어를 갖고 있으며, 시그널과 이미지 프로세싱, 오디오 프로세싱, 컨트롤 이론을 위한 특별한 함수를 포함하여, 매우 거대한 Math 라이브러리를 갖고 있다.
Octave는 백엔드로서 Gnuplot을 사용하기 때문에, Gnuplot을 사용하여 그릴 수 있는 모든 것을 Octave를 사용하여 그릴 수 있다. Octave는 계산을 위한 더욱 풍부한 언어를 갖고 있고, 이것이 최대 장점이다. 하지만 Gnuplot으로 제한된다.
Octave-Forge Web site (SimpleExamples)에서 발췌한 다음 예제에서, 나는 Lorentz Strange Attractor를 그렸다. Listing 4는 Windows 플랫폼과 Cygwin에서의 Octave용 대화식 다이얼로그를 보여준다. 이 예제는 일반 방정식 문제 풀이 프로그램인 lsode 사용법을 설명한다.
Listing 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의 플롯은 Listing 4의 Octave 코드의 결과이다.
그림 3. Octave를 사용한 Lorentz 플롯
GNU Octave(그리고 Gnuplot)은 multiplot 기능을 사용하여 한 페이지의 여러 플롯들을 만들어낼 수 있다. 이 기능을 사용하여, 많은 플롯들이 subwindow 명령어를 사용하여 특정 플롯을 만들고 정의하는 방법을 정의한다. subwindow가 정의된 후에, 플롯을 정상적으로 만들고 다음 subwindow로 갈 수 있다. (Listing 5)
Listing 5. Octave로 multiplot 만들기
>> 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는 결과 multiplot 페이지이다. 이것은 관련 플롯들을 하나로 모아서 비교 또는 대조할 수 있는 훌륭한 기능이다.
그림 4. GNU Octave를 사용한 multiplot
Octave를 백엔드에 Gnuplot을 갖춘 고급 언어로 생각해도 된다. 풍부한 Math 라이브러리를 제공하고, Matlab을 거뜬히 대체한다. 또한, 스피치 프로세싱, 최적화, 기호 계산을 위해, 사용자가 개발한 패키지를 사용하여 확장도 가능하다. Octave는 Debian 같은 GNU/Linux 배포판에 포함되어 있고, Windows(Cygwin)와 Mac OS X에서도 사용될 수 있다. (참고자료)
Scilab은 숫자 계산과 시각화를 수행한다는 점에서 GNU Octave와 비슷하다. Scilab은 인터프리터이며, 엔지니어링 및 과학 애플리케이션을 위한 고급 언어이다.
Scilab은 1994년에 탄생했으며, 프랑스 at Institut national de recherche en informatique et en automatique (INRIA)와 Ecole Nationale des Ponts et Chaussees (ENPC)의 연구원들이 개발했다. 2003년부터, Scilab은 Scilab Consortium에서 관리하고 있다.
Scilab에는 Math 함수용 라이브러리가 포함되어 있으며, C와 Fortran 같은 고급 언어로 작성된 프로그램까지 확장 가능하다. 통합된 고급 언어가 포함되어 있지만, C와는 약간 다르다.
많은 텍스트북이 2-D와 3-D 그랙픽과 애니메이션, 최적화, 통계, 그래프와 네트워크, 시그널 프로세싱, 하이브리드 동적 시스템 모델러와 시뮬레이터, 기타 커뮤니티 기여 등을 제공한다.
대부분의 유닉스 시스템과 최신 Windows 운영 체계에서 Scilab을 사용할 수 있다. GNU Octave와 마찬가지로, Scilab도 문서화가 잘 되어 있다. 유럽 지역의 프로젝트이기 때문에, 영어 외의 다른 언어로 된 문서도 찾아 볼 수 있다.
Scilab이 시작되면, 인터프리터와 작업할 수 있는 창이 디스플레이 된다. (그림 5)
그림 5. Scilab 작업
이 예제에서, 0부터 2PI (0.2 step size) 범위의 값으로 벡터(t)를 만든다. 그런 다음, (z=f(x,y)를 사용하거나, xi,yi 점의 표면을 사용하여) 3-D 플롯을 만든다.
그림 6. 그림 5의 명령어로 만든 Scilab 플롯
Scilab에는 복잡성을 최소한으로 줄이고 플롯을 생성할 수 있는 라이브러리와 함수들이 포함되어 있다. 예를 들어, 3차원 히스토그램(histogram) 플롯을 만드는 예제는 다음과 같다.
-->hist3d(5*(rand(5,5));
우선, rand(5,5)는 size 5,5의 매트릭스를 구현하고, 무작위 값(나는 최대 5까지로 했다.)을 포함시킨다. 이 매트릭스는 hist3d 함수로 전달된다. 결과는 그림 7과 같은 히스토그램 플롯이다.
그림 7. 무작위 3 차원 히스토그램 플롯 만들기
Scilab과 Octave는 비슷하다. 모두 커뮤니티 참여를 기반으로 한다. Scilab은 Fortran 77로 작성된 반면, Octave는 C++로 작성되었다. Octave는 시각화에 Gnuplot을 사용한다. Scilab은 자체로 제공된다. Matlab을 알고 있다면, Octave를 선택하는 것이 호환성에 좋다. Scilab에는 많은 Math 함수가 포함되고, 시그널 프로세싱에 좋다. 아직도 어떤 것을 선택해야 할지 모르겠다면, 두 개 모두를 사용해 보기 바란다. 두 개 모두 훌륭한 툴이고, 태스크에 맞춰 사용하면 된다.
산스크리트어로 마법사를 의미하는 MayaVi는 그래픽 디스플레이에 Python과 Visualization Toolkit (VTK)을 결합시키는 데이터 시각화 툴이다. MayaVi는 Tkinter 모듈로 개발된 그래픽 사용자 인터페이스(GUI)를 제공한다. Tkinter는 Tk 인터페이스이고, 대게, Tcl과 함께 사용된다.
MayaVi는 원래 Computational Fluid Dynamics (CFD)용 시각화 툴로서 개발되었다. 다른 분야에서도 그 유용성이 입증된 후에, 범용 과학 데이터 비주얼라이저(visualizer)로서 등록되었다.
MayaVi의 힘의 원천은 VTK이다. VTK는 데이터 시각화와 이미지 프로세싱을 위한 오픈 소스 시스템으로서, 과학 커뮤니티에서 광범위하게 사용된다. VTK는 C++ 라이브러리를 비롯하여, Tcl/Tk, Java, Python, C++용 스크립팅 인터페이스를 포함하여 놀라운 기능이 들어있다. VTK는 UNIX, Windows, MAC OS X 등, 많은 운영 체계에서 지원된다.
VTK 주위의 MayaVi 쉘은 다른 Python 프로그램으로부터 Python 모듈로서 반입될 수 있고, Python 인터프리터를 통해 스크립팅 된다. MayaVi에서 제공되는 tkinter GUI로는 필터의 설정과 적용뿐만 아니라, 라이팅(lighting) 효과를 조작할 수 있다.
그림 8은 Windows 플랫폼에서 MayaVi를 사용한 시각화 예제이다.
그림 8. MayaVi를 사용한 3-D 시각화 (CT 심장 스캔 데이터)
MayaVi는 Python 스크립팅 언어로 VTK를 확장한 경우이다.
Maxima는 Octave와 Scilab과 맥락을 같이 하는, 모두 기호로 된, 숫자 계산 프로그램이다. Maxima의 개발은 1960년대 후반에 Massachusetts Institute of Technology (MIT)에서 시작되었고, 오늘날까지 관리되고 있다. 원래 버전(컴퓨터 대수(algebra) 시스템)은 DOE Macsyma로 불렀고, Mathematica 같은 일반적인 애플리케이션 개발을 주도했다.
Maxima는 기호 계산 기능과 함께 여러분이 기대하는 기능들을 제공한다. (미분/적분, Leaner 시스템, Nonlinear 방정식). 전통적인 루프(loop)와 조건을 사용하여 Maxima로 프로그램을 작성할 수 있다. 또한, Maxima에서 Lisp의 힌트도 얻을 수 있다. (map과 apply 함수) Maxima는 Lisp로 작성되며, Maxima 세션에서 Lisp 코드를 실행할 수 있다.
Maxima는 하이퍼텍스트 기반으로 훌륭한 온라인 도움말 시스템도 갖고 있다. 특정 Maxima 함수가 작동하는 방법을 알고 싶다면, example( desolve )을 입력하고, 사용법 예제들을 볼 수 있다.
Maxima는 또한 규칙과 패턴 같은 재미있는 기능도 갖추고 있다. 이러한 규칙과 패턴들은 식을 간소화 하는데 사용된다. 규칙들은 가환 대수(Commutative algebra)와 비가환 대수(noncommutative algebra)에 사용될 수 있다.
Maxima는 사용자와 인터랙팅 할 때 인터프리터를 사용하고, 결과가 같은 창 또는 다른 팝업 창으로 직접 제공된다는 점에서 Octave와 Scilab과 비슷하다. 그림 9에서, 나는 간단한 3-D 그래프의 플롯을 요청하고 있다.
그림 9. Maxima 인터랙팅
결과 플롯은 그림 10과 같다.
그림 10. 그림 9의 명령어에 대한 결과 Maxima 플롯
시각화 툴을 논할 때, Open Data Explorer (OpenDX)가 빠지면 안된다. OpenDX는 IBM의 강력한 시각화 데이터 익스플로러의 오픈 소스 버전이다. 이 툴은 1991년에 Visualization Data Explorer로 처음 출시되었고, 이제는 데이터 시각화용 오픈 소스로서 사용할 수 있고 데이터 시각화용 애플리케이션 구현에도 사용된다.
OpenDX에는 고유의 많은 기능들이 있지만, 아키텍처를 특히 주목 할만 하다. OpenDX는 클라이언트/서버 모델을 사용하는데, 클라이언트와 서버 애플리케이션은 분리된 호스트에 있다. 서버는 고성능 크런칭(공유 메모리 멀티-프로세서)용으로 설계된 시스템에서 실행되고, 클라이언트는 그래픽 랜더링을 위해 설계된 호스트에서 개별적으로 실행될 수 있다. OpenDX는 많은 서버들로 문제들이 나뉘어 지도록 하여, (이종 서버들이라도) 동시에 크런칭 될 수 있다.
OpenDX는 시각화 프로그램이 그래픽으로 정의되도록 하는 데이터-흐름 프로그래밍 모델을 지원한다. (그림 11) 각각의 탭은 “page”(함수와 비슷하다.)를 정의한다. 데이터는 변형에 의해 처리된다. 예를 들어, 중간 "Collect" 모듈은 인풋 객체들을 그룹으로 모으고, 이들을 전달한다. (이 경우, 이미지를 디스플레이 하는 "image" 모듈과, 이미지를 보여주는 방법을 지정하는 "AutoCamera" 모듈로 전달한다.)
그림 11. OpenDX를 이용한 시각적 프로그래밍
OpenDX에는 커스텀 모듈을 구현하는데 도움이 되는 모듈 빌더도 포함되어 있다.
그림 12는 OpenDX에서 생성된 샘플 이미지이다.(Dalhousie University의 OpenDX 튜토리얼인 Physical Oceanography에서 발췌한 것이다.) 이 데이터는 land topology 데이터와 수심(bathemetry)을 나타낸다.
그림 12. OpenDX를 이용한 데이터 시각화
OpenDX는 가장 유연하고 강력한 데이터 시각화 툴이지만, 가장 복잡하기도 하다. 다행히도, 많은 튜토리얼(그리고 참고서)들이 있다. (참고자료)
지금까지 오픈 소스 GNU/Linux 시각화 툴을 소개했다. 여기에 소개한 것 외에도 Gri, PGPLOT, SciGraphica, plotutils, NCAR Graphics, ImLib3D 등이 있다. 이 모두가 오픈 소스이고, 어떻게 작동하고 수정되는지도 볼 수 있다. 만약, 그래픽 시뮬레이션 환경을 찾고 있다면, Open Dynamics Engine (ODE)과 OpenGL을 참조하라.
어떤 툴이 자신의 필요에 가장 잘 맞는지를 결정해야 한다. 광범위한 시각화 알고리즘을 갖춘 강력한 시각화 시스템을 원한다면, MayaVi가 적격이다. 수치 계산과 시각화를 원한다면 GNU Octave와 Scilab이 맞는다. 기호 계산 기능이 필요하면, Maxima가 좋다. 마지막으로, 기본적인 플롯팅은 Gnuplot이 적격이다.
교육
-
not so Frequently Asked Questions
-
GNU Octave Repository
-
Data Explorer tutorials
-
Dabbling with a wealth of statistical facilities (developerWorks, September 2004)Functional programming and data exploration (developerWorks, October 2004)Reusable and object-oriented programming (developerWorks, January 2006)
-
Numerical Python (developerWorks, October 2003).
-
디벨로퍼웍스 리눅스 존 (한글 페이지)
-
developerWorks technical events and Webcasts
제품 및 기술 얻기
-
gnuplot home page
-
GPlot
-
GNU Octave
-
MayaVi Data Visualizer
-
Visualization Toolkit (VTK)
-
Scilab
-
Maxima
-
Open Data Explorer
-
NCAR Graphics home page
-
Gri
-
SciGraphica
-
ImLib3D library
-
ODE
Open/GL
-
ROOT
-
Order the SEK for Linux, a two-DVD set containing the latest IBM trial software for Linux from DB2®, Lotus®, Rational®, Tivoli®, and WebSphere®.
-
IBM 제품 시험판 다운로드 (한글 페이지)
토론
M. Tim Jones는 Emulex Corp(Longmont, Colorado)의 소프트웨어 엔지니어이다. 이곳에서, 네트워킹 및 스토리지 제품을 설계하고 있다. 디자인 분야는 통신 위성용 실시간 커널부터 네트워킹 프로토콜과 임베디드 펌웨어에 이른다. 인공 지능(AI)와 애플리케이션 레이어 프로토콜 개발을 주제로 많은 글들을 썼다. AI Application Programming (두 번째 에디션), GNU/Linux Application Programming, BSD Sockets Programming from a Multilanguage Perspective, and TCP/IP Application Layer Protocols for Embedded Systems (모두 Charles River Media)를 집필했다.