메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

IT/모바일

에릭 하게만 시리즈 2 - 파이썬으로 데이터를 시각화하여 그래프 만들기

한빛미디어

|

2002-05-07

|

by HANBIT

10,500

저자: 에릭 하게만(Eric Hagemann), 역 전순재

들어가는 말

힘들었던 지난 번 기사는 잠시 뒤로 하고, DISLIN이라는 데이터 시각화 패키지를 탐험해 보자. DISLIN이 설치되어 있지 않으면, www.linmpi.mpg.de/dislin에서 소프트웨어를 다운받을 수 있다. DISLIN이 제공하는 튼튼한 패키지로 파이썬 프로그래머는 2D와 3D 그래프를 만들 수 있다. 또한 DISLIN은 line, box, circle과 같은 기본적인 그리기 명령어를 지원하기도 하는데, 이 덕분에 DISLIN은 포괄적인 그리기 도구로서의 기능도 할 수 있다. (이것에 대해서는 다음 기사에서 자세히 설명하겠다.) DISLIN과 NumPy를 조합하면 엄청난 과학적 컴퓨팅 패키지가 된다.

패키지 설치가 끝나면, DISLIN 파이썬 매뉴얼을 살펴보자(웹 사이트에서 볼 수 있다). 이 짧은 문서에서는 패키지에서 제공하는 기본적인 그리기 명령어들의 사용법은 물론이고 파이썬으로 프로그래밍하는 예제들도 보여준다. 사용할 수 있는 무수한 명령어을 자세하게 설명해 놓은 매뉴얼을 얻을 수도 있다. 그렇지만 그 완벽한 매뉴얼에 들어가기 전에 이 기살르 좀 더 읽으면서 더 쉬운 방법을 찾도록 해보자.

Quickplots

DISLIN에서 내 눈을 사로잡은 것은 Quickplots를 사용할 수 있다는 것이었다. Quickplots은 DISLIN의 기본적인 루틴으로서 복잡한 도표들을 간단한 명령어로 만들어 낼 수 있다. Quickplots은 명령어 프롬프트로 파이썬을 사용할 때 상호대화적인 도구로 사용하면 정말 좋다.

시작하기 전에 먼저 환경부터 설정할 필요가 있다. 쉽게 DISLIN과 NumPy 함수에 접근하려면 각 세션(혹은 스크립트 파일)이 시작될 때 먼저 다음과 같은 두 개의 명령어를 반드시 실행해야 한다. 이렇게 하고 나면 그 두 라이브러리에 있는 함수들을 공통 네임스페이스(common namespace)에서 사용할 수 있을 것이다.
>>> from dislin import *
>>> from Numeric import *
가장 간단한 Quickplot 루틴은 plot()이다. plot()은 라인으로 연결된 데이터 점들을 담은 2D 그래프를 그려낸다. 실제로 작동하는 것을 보려면 파이썬 명령어 창을 열고 다음을 타이핑해 넣으면 된다.
>>> x = arange(100.0)
>>> plot(x,sin(x/3)+cos(x/5))
>>> disfin()
첫 번째 명령어는 NumPy의 함수로서 x=1.0,…,100.0인 배열 하나를 만든다. 여기서 정말로 명심해 두어야 할 점은 100.0에서 .0이라고 표기함으로 인해 그 숫자들을 부동소수점 수로 만들어 준다는 것이다. 그렇게 하지 않을 경우 정수들을 담은 배열 하나를 만들 것이다. 다른 방식을 사용할 경우 다음과 같이 사용할 수 있다.
>>>x = arange(100,Float) 
이렇게 하면 x는 부동소수점 수가 될 것이다. plot() 명령어는 인수로 두 개를 각각 배열로 취한다. 그리고 독립 변수 혹은 세로 축인 두 번째 인수를 종속 변수 혹은 가로 축인 첫 번째 인수에 대하여 도표화한다. 더욱 형식을 갖추어 말하면 plot() 도표 명령어는 함수 f(x)를 x에 대하여 도표화한다. 이 예제를 보여주기 위해 필자는 아래의 함수를 선택하였다.

두 개의 사인 함수의 합

결과로 나온 도표는 아래 그림과 같다. disfin() 함수는 도표 패키지에게 현재 그래프 작업이 완성되었으니 렌더링하라고 명령한다. 그리고 오른쪽 마우스 버튼이 클릭될 때까지 콘솔을 동결시킨다. 오른쪽 마우스 버튼을 클릭하고 나면 도표는 깨끗이 지워지고 제어는 다시 콘솔로 돌아온다.

이와 같이 간단한 2D 도표외에도, 3D 그래픽도 가능한 Quickplot 루틴이 몇몇 개 있다. 이러한 루틴들 각각은 똑같이 기본적인 인수들을 사용한다. 첫 번째 인수는 값들이 담긴 행렬 하나이고 다음에 일차원 배열 두 개가 따른다. 삼차원 도표에는 축이 세 개 있다. x와 y축이 형성한 평면(flat surface)에 z축이 세워진다. z축 행렬에 있는 값들은 x-y 평면의 (위 또는 아래로 세워지는) 높이이다. x와 y의 일차원 배열은 각 축을 따라 눈금을 제공한다. 또 다시 형식적인 표기법으로 되돌아 가보면 3D 루틴은 x와 y에 대하여 z=f(x,y)를 도표화한다. 3D 도표들을 위해 필자는 아래광 같은 함수를 선택했다.

이차원 사인곡선 함수

3D 도표를 생성하는 예제로서 다음 명령어들을 시험해 보자.
>>>z_mat = zeros((180,180),Float)
>>>x_ray = arange(180.0)
>>>y_ray = arange(180.0)

>>>dtr = 3.141592654/180.0

>>>for x in x_ray:
	for y in y_ray:
		z_mat[int(x)][int(y)] = sin(x*3*dtr)*sin(y*2*dtr)
>>>surface(z_mat,x_ray,y_ray)
>>>disfin()
첫 번째 명령어는 미리 적절히 크기가 조정된 결과 행렬을 만들어 낸다. zeros() 함수를 사용하면 배열의 크기를 조절 할 수 있고 그 배열을 위해 저장 공간을 미리 할당할 수 있다. zeros() 함수에서 두 번째 인수는 행렬에 있는 0들이 정수형 0이 아니라 부동 소수점형 0이 되도록 선언한다(기본 값으로는 정수형으로 생성될 것임). 만약 두 번째 인수를 생략하면 바로 다음에 일어나는 계산 결과는 소수점 이하가 잘려 나가고 z_mat 행렬에 정수 값들로 저장될 것이다(이것은 우리가 원하던 바가 아님!)

surface() 함수는 다음과 같은 그래프를 만들어 내는 Quickplot 루틴이다.

이것만으로도 벌써 흥분할 수도 있겠지만 단색이라 너무 단조롭다는 생각이 들지 않는가? surface() 함수를 surshade() 함수로 전환하면 다음과 같은 도표가 생성된다.

어떤가? 조금 더 나아지지 않았는가! 색을 사용하니 도표의 특징이 정말 더 잘 드러난다. QuickPlots에서 보여주는 마지막 예제로서, surshade() 함수를 surf3() 함수로 전환하면, 아래 그림과 같이 같은 데이터에 대하여 색깔 있는 등고선 도표가 만들어질 것이다. 오른쪽에 보이는 색깔 막대는 도표에서 표현되는 색상들의 범위를 보여준다.

Quickplot 수정

맞춤 라벨을 축에 추가할 수 있으며 QuickPlot의 특징들 중에 상당수를 변경할 수 있다. 변경을 하려면 setvar() 루틴을 통하여 플롯팅 패키지에 변수들을 설정해 넣으면 된다. 사용할 수 있는 선택사항의 완벽한 목록은 DISLIN 파이썬 매뉴얼을 참조하면 된다. 축 라벨을 추가해서 첫 번째 예제를 다시 만들면 아래와 같이 보인다.
>>> x=arange(100.0)
>>> setvar("X","Independent Variable")
>>> setvar("Y","Dependent Variable")
>>> plot(x,sin(x/3)+cos(x/5))
>>> disfin()

기본을 넘어서서

자신만의 맞춤 도표를 만들어 보거나 이전의 예제들을 상당 정도로 변경해 본다면 여러분은 DISLIN 함수 모음을 좋아할 수 밖에 없을 것이다. 여러분이 지금 바로 이러한 점을 느끼고 있다면, 폴 매그윈(Paul Magwene)이 작성한 pxDislin 모듈을 여기에서 점검해 보도록 하여라. PxDislin은 DISLIN에 대한 객체지향 래퍼(wrapper)로 쉽고 간결한 프로그래밍 모델을 제공한다.

PxDislin

pxDislin을 시작하려면 새로이 콘솔을 열고 pxDislin 라이브러리를 임포트해야 한다.
>>> from pxdislin import * 
이것은 DISLIN 라이브러리 그 자체를 처리해 준다. (원하지 않는 사람도 있을 수 있지만) NumPy를 원한다면 그것도 꼭 임포트 하도록 해라.

PxDislin이 가지는 클래스 계층도는 기본적인 dPlot 객체 위에 구축된다. 가장 기본적인 그래픽은 dAxis 객체를 합병한 dPlot 객체로 구성된다. dPlot 객체는 그 위에 그림이 그려질 캔버스(canvas)로 간주될 수 있다. dAxis 객체는 그 크기를 정의하는데 도움이 된다. 예를 하나 들어보자.
>>> plot = dPlot()
>>> axis = dAxis(-10,10,-10,10)
>>> plot.add_axis(axis)
>>> plot.show()
첫 번째 라인은 기본적인 도표 객체를 만든다. 두 번째 라인은 축 객체 하나를 만들었다. 세 번째 라인은 앞의 두 객체를 연결했으며 네 번째 라인은 도표를 그리도록 만들었다. 잘만 따라 한다면 사각형 창이 화면에 빈 축을 가지고 나타날 것이다.

PxDislin 객체들은 속성들(attributes)을 통하여 많은 선택사항을 지원한다. 여기서 속성은 "options"과 "info" 두 가지 형으로 나누어진다. 선택사항(Options)형은 도표가 생성되고 난 후, 그 도표에서 변경하기 원하는 특징들을 가리킨다(보통은 도표의 모양을 변경하기를 원할 것임). 선택사항(Options) 형은 객체의 config()을 호출하면 설정된다. pxDislin에서 object.config()을 호출하는 것과 object()를 호출하는 것은 동등하다. 위의 예제에서 오른쪽 마우스 버튼을 클릭하여 도표를 지우고 다음을 타이핑해 넣어보자.
>>>plot(ttext="Title")
>>>plot.show()
새로운 도표창이 나타날 것이다. 이 전과 비슷하게 보이지만 제목에 문자열이 있다. 특정 객체에 대하여 선택사항의 목록을 보려면 그냥 그 객체의 이름을 타이핑해 넣고 다음에 빈 괄호 한 쌍을 타이핑 하면 된다.
>>> plot()

*dPlot:
        app_look = console
        color = fore
        continue_key = Return
        display_type = screen
        external_ID = None
        external_type = window
        filename = dis.out
        font = default
        font_size = 36
        height = 500
        origin = (25, 25)
        page_height = 3000
        page_width = 3000
        ps_origin = (25, 25)
        pscript = None
        pscript = None
        psfont = courier
        psfont = courier
        scale = 1.0
        screen_mode = normal
        size = None
        suppress_disout = 1
        tsize = 64
        ttext = test
        width = 500
        *END OBJECT: dPlot
여기서 주목할 것은 각각의 선택사항에 대하여 현재 설정이 무엇인지 알려주는 이 명령어의 또다른 멋진 특징이다.

정보 속성(info attributes)은 직접적으로 객체의 생성에 영향을 미치며(전형적으로 정보 속성은 도표로 찍혀질 데이터를 가지고 있음) 점(.) 표기법을 사용하여 설정한다. 정보 속성(info attributes)은 매개변수가 함수에 건네지는 것처럼 객체가 생성될 때 건네진다.

Plot Routines

기본적인 DISLIN 라이브러리처럼, pxDislin에는 고수준의 도표 생성 함수들이 담겨 있다. 첫 번째 예제와 비슷하게 2D 도표는 다음과 같이 pxDislin으로 간단하게 만들어 볼 수 있다.
>>> x=arange(100.0)
>>> y = sin(x/3)+cos(x/5)
>>> plot = dScatter(x,y)
>>> plot.add_axis(dAxis(0,100,-4,4))
>>> plot.show().
위의 코드를 실행하고 나면 다음과 같은 결과를 얻을 것이다.

도표의 데이터를 열람하려면 다음과 같이 plot.xl라고 타이핑해 넣어야 한다(xl은 종속 변수를 담고 있는 정보 속성(info attribute)임). 정보 변수들을 담은 리스트를 보려면 다음과 같이 object._info라고 타이핑해 넣으면 된다. 아래 예제는 방금 생성된 산포 도표(scatter plot)의 정보 매개변수(info parameters)들을 보여준다.
>>> plot._info
["axis", "legend", "title", "xl", "yl"]
pxDislin을 사용하면 3D 도표도 만들 수 있다. 다음은 앞의 예제를 다시 만든 것이다. 여기서 주목할 것은 d3Dsurface 객체가 일정 범위에 대해서 평가될 함수 하나를 첫 번째 인수로 취한다는 것이다. 두 번째 인수는 x 변수의 시작, 중지, 범위를 지정하고 세 번째 인수는 y 변수의 시작, 중지, 범위를 지정한다.
>>> def f(x,y):
...     dtr = 3.1415 / 180.0
...     return(sin(x*3*dtr)*sin(y*2*dtr))
...

>>> plot = d3DSurface(f,(0,180.0,1),(0,180.0,1))
>>> plot.surface(clr_top=20)
>>> plot.surface(clr_bottom=230)
>>> plot.show()

게임 끝

DISLIN 패키지를 아주 간단하게 소개했기 때문에 이 기사에서 이 패키지의 모든 능력을 보는 것은 불가능하다. 다음 기사에서는 패키지 사용법과 기능들에 대한 예제들을 더 많이 소개 할 것이다. DISLIN과 pxDislin을 계속해서 열심이 읽어 여러분 스스로도 다른 기능들을 찾아 보기 바란다. 재미있는 함수들을 가지고 3D 칼라 도표를 만들 수 있는데 이를 거부할 사람이 누가 있을까? 기본적인 도표들과 이와 관련된 함수 목록은 여기에 가면 볼 수 있다. 재미있는 시간 되기 바란다!

다음 기사 예고

이제 기본적인 개론들은 이만 하기로 하고 다음 기사부터는 선형 대수학의 세계를 그래픽적으로 살펴볼 것이다. 기하학이라는 도구를 사용하면 행렬과 벡터의 의미에 대한 깊은 통찰을 얻을 수 있다.
에릭 하게만(Eric Hagemann)은 임베디드에서 메인프레임까지 모든 종류의 컴퓨터에서 숫자를 빨리 처리하기 위한 알고리즘 전문가이다.
TAG :
댓글 입력
자료실