matplotlib svn에서의 큰 변화
최근 내부적인 matplotlib 변환 기반구조의 중대한 변화를 메인 matplotlib 코드베이스 안에 합병했다. 이 변화가 전형적인 pylab 사용자에게는 영향을 미치지 않겠지만, API와 변환 코드를 사용하는 사람 중에는 새로운 변환방법과 작동시키기 위하여 코드를 바꿀 필요가 있을 수 있다. API의 이주 이력과 변경사항에 대한 요약은 이주 그리고 API_CHANGES를 참고하자. 그리고 문제가 있다면 메일링 리스트에 알려주시기를 바란다

기부
matplotlib 개발을 도와주세요. 기부하셔서 개발자의 훈련을 돕고 matplotlib 개발을 도우세요.

새로 나온 배포판
matplotlib 0.91.2이 출시됨. 새로운 특징은 무엇이 새로운가 참조.

Matplotlib
Home
What's New
Download
Installing
Screenshots
Examples (zip)
Mailing lists
Donate

문서
Tutorial
User's Guide (pdf)
API (pdf)
FAQ
Cookbook / wiki
pylab interface
Class library
Backends
Toolkits
Fonts
Interactive
Goals

기타
Credits
License

  

한글판 johnsonj 2008.06.17 화

matplotlib 사용법

파이썬 초보라면 파이썬 자습서numpy 자습서를 보신후에 matplotlib으로 작업하시기를 권장한다. 그렇지 않으면 좌절할 수도 있다. 두 기술에 익숙하다면, matplotlib가 쉬울 것이다.

matplotlib의 뚜껑을 열어 보면 수 많은 특징이 있다. 이 자습서는 표면만을 훓어본다. 이 자습서를 숙지하고 나면, 다음 단계는 (물론, 다름 아닌 자신만의 그림을 그리는 작업에 들어가는 것인데) 소스(*.tar.gz or *.zip)를 내려받아 matplotlib 예제 디렉토리를 훓어 보는 것이다. 날짜 도표 작업을 하고 있다면 여러 날짜 데모가 있을 것이다. 이름에 examples/date_demo1.py와 같이 힌트가 있다. 마찬가지로 이미지 데모를 찾고 있다면 examples/image_demo.py가 있을 것이고, 등고선 데모가 필요하다면 examples/contour_demo.py가 있다. 그래픽 사용자 인터페이스와 함께 matplotlib를 사용하는 방법은 examples/embedding_in_wx.py에 있으며 등등 수 없이 많다. 이 예제들은 표준 윈도우즈 설치기에 포함되어 있지 않으므로, 종종 간과되는데, 그 때문에 여기에서 다시 한 번 강조하는 바이다.

다음으로 숨겨진 보석을 발견할 곳은 무엇이 새로운가 페이지이다. matplotlib에 도입될 때마다 각 특징이 도입된 버전과 함께 이 페이지에 나열되어 있으며, 보통 예제와 함수 문서로 가는 링크가 함께 있다. 그 페이지를 훓어 보는 것은 어떤 능력과 맞춤 기능이 지원되는지 알아보는 가장 좋은 방법중의 하나이다.

matplotlib는 다양한 환경설정에서 작동하도록 설계되었다: 어떤 사람들은 그것을 웹 서버에서 "배치 모드"로 사용하여 이미지를 만들어 낸다. 또다른 사람들은 그래픽 사용자 인터페이스(GUIs)를 사용하여 상호대화적으로 도표를 작성한다. 그리하여 matplotlib를 재단해야만 원하는 일을 할 수 있다. 특히, 맞춤 matplotlibrc 파일을 한 번 살펴볼 필요가 있다. 이 파일에서 그냥 이미지를 만들지 아니면 GUI(후방 설정)를 사용할지 설정할 수 있으며 , 쉘에서 상호대화적으로 작업할지를 설정할 수 있다 (상호대화적 설정). 또, 상호대화적 사용법, show가 왜 이래요? 그리고 matplotlib 창이 꼼짝 안해요를 먼저 읽고 난 후에 아래의 예제를 타자해 넣으시기를 바란다. 많은 새로운 matplotlib 사용자들이 이 절차를 지키지 않아 혼란을 겪는다. 또는 적어도 문제가 발생하면 바로 다시 돌아와 읽을 마음의 준비를 하시기 바란다.

matlab로 도표 작업을 해 보았다면 자연스럽게 matplotlib의 사용할 수 있을 것이다. 그리고 그렇지 않더라도 눈에 보이는 그대로 이해하실 수 있으리라 믿는다. 기본 개체는 그림이며, 그림에는 축이 있으며, 축에는 눈금이 있다. 축은 xlabels, ylabels, titles, ticklabels, 그리고 text로 장식된다.

다음은 matplotlib로 그림을 만들어 낼 수 있는 가장 단순한 스크립트이다.

간단한 도표

from pylab import *
plot([1,2,3,4])
show()
        

파이썬 초보라면, 제일 먼저 이 도표에 관하여 드는 의문은 이럴 것이다. "왜 X축(xaxis)은 범위가 0-3이고 Y축(yaxis)은 1-4이지?" 그 대답은 이렇다. 단일 리스트나 배열을 plot 명령에 넘기면, matplotlib는 그것을 y-값 벡터라고 간주하고 자동으로 x-값들을 만들어 낸다. 파이썬은 0에서 시작하고, 기본 x 벡터는 y 벡터와 길이는 같지만 0에서 시작한다. 그러므로 x 벡터는 [0,1,2,3]이다. 물론, 기본 행위가 마음에 들지 않으면, x 데이터를 명시적으로 지정할 수 있다. 예를 들어 plot(x,y)와 같은 경우 xy는 길이가 같은 벡터이다.

plot은 다재다능한 명령어이며, 가변 개수의 인자를 받는다. 예를 들어, x versus y를 도표하려면, 명령어를 다음과 같이 제출하면 된다

plot([1,2,3,4], [1,4,9,16])
x와 y 쌍 인자마다, 선택적으로 세 번째 매개변수가 있는데 이는 형식화 문자열로서 도표의 색깔과 라인 유형을 지시한다. 형식화 문자열의 기호와 심볼은 matlab으로부터 기원하며, 색상 문자열을 라인 스타일 문자열과 결합할 수 있다. 기본 형식화 문자열은 'b-'인데, 이는 솔리드 청색 라인이다 (질문 금지, The Mathworks에 문의할 것). 예를 들어, 위의 예제를 빨간 원으로 도표하려면, 다음과 같이 제출하면 될 것이다

형식화 문자열 사용하기

from pylab import *
plot([1,2,3,4], [1,4,9,16], 'ro')
axis([0, 6, 0, 20])
savefig('secondfig.png')
show()

줄 스타일과 형식화 문자열에 관한 완전한 목록은 plot 문서를 참조하자. 위의 예제에서 axis 명령어는 [xmin, xmax, ymin, ymax] 리스트를 받아 그 축의 가시 범위를 지정한다.

matplotlib가 리스트와만 작동해야 한다면, 수치 처리에 큰 쓸모가 없었을 것이다. 일반적으로 numpy 배열을 사용한다. 사실, 모든 연속열은 내부적으로 numpy 배열로 변환된다. 아래 예제는 배열을 사용하여 하나의 명령 안에서 여러 줄을 다양한 포맷 스타일로 도표하는 방법을 보여준다.

단 하나의 plot 명령어로 여러 줄 그리기

from pylab import *
t = arange(0.0, 5.2, 0.2)

# 빨간색 옆줄, 파란색 사각형과 초록색 삼각형
plot(t, t, 'r--', t, t**2, 'bs', t, t**3, 'g^')
show()

줄 특성 통제하기

라인은 속성이 많다: linewidth, dash style, antialiased, 등등; lines 참조.

여러가지 방식으로 줄 특성을 설정할 수 있다.

# 키워드 인자를 사용한다
plot(x, y, linewidth=2.0)

# Line2D 실체의 설정자 메쏘드를 사용한다.  plot은 줄 리스트를 돌려준다
# 예를 들어 line1, line2 = plot(x1,y1,x2,x2).  아래에 한 줄만 있다
# 그래서 길이가 1인 리스트이다. line, = plot(x, y, 'o') 줄에서 터플 풀기를 사용하여
# 리스트의 첫 요소를 얻는다
line, = plot(x, y, 'o')
line.set_antialiased(False) # 앤티엘리아싱 비활성화

# set 명령어를 사용한다.  아래의 예제는 matlab의 그래픽 스타일 처리 명령어를
# 사용하여 여러 특성을 라인 리스트에 설정한다.
# 설정은 객체 하나 또는 객체 리스트와 투명하게 작동한다
lines = plot(x1, y1, x2, y2)
setp(lines, color='r', linewidth=2.0)

# set은 또한 문자열로 특성 이름과 함께 matlab 스타일의 인자 쌍을 받는다.
# 그렇지만 본인은 위의 파이썬스러운 키워드 인자를 더 선호한다
setp(lines, 'color', 'r', 'linewidth', 2.0)

라인 특성

특성
alpha 0-1 비율의 알파 투명도
antialiased True | False - 앤티엘리어스 화면가공법 사용 여부
color matplotlib 색상 인자
label 선택적으로 범례에 사용되는 문자열
linestyle 다음중 하나 -- : -. -
linewidth 점단위 라인 두께, 부동소수점수로 나타냄
marker 다음중 하나 + , o . s v x > < ^
markeredgewidth 마커 심볼 주위의 라인 두께
markeredgecolor 마커가 사용되었을 경우 모서리 색상
markerfacecolor 마커가 사용되었을 경우 전경 색상
markersize 마커의 점단위 크기

라인 특성 리스트를 얻으려면, 라인(들)을 인자로 하여 setp 함수를 호출하면 된다.
>>> lines = plot([1,2,3])
>>> setp(lines)

여러 그림과 축을 가지고 작업하기

Matlab과 pylab은 현재 그림과 현재 축이라는 개념이 있다. 모든 도표와 텍스트 라벨 명령어는 현재 축에 적용된다. 함수 gcaAxes 실체로 현재 축을 돌려주고, 함수 gcfFigure 실체로 현재 그림을 돌려준다.

보통, 이에 관해서는 신경 쓸 필요가 없다. 왜냐하면 모든 것은 배경뒤에서 처리해 주기 때문이다. 다음은 두 개의 하부도표를 만드는 스크립트이다

다중 세부도표

from pylab import *

def f(t):
    s1 = cos(2*pi*t)
    e1 = exp(-t)
    return multiply(s1,e1)

t1 = arange(0.0, 5.0, 0.1)
t2 = arange(0.0, 5.0, 0.02)

figure(1)
subplot(211)
plot(t1, f(t1), 'bo', t2, f(t2), 'k')

subplot(212)
plot(t2, cos(2*pi*t2), 'r--')
show()

여기에서 figure 명령어는 선택적이다. 'figure(1)'이 기본으로 생성되기 때문이다. 꼭 마찬가지로 수작업으로 축을 지정하지 않으면 기본으로 subplot(111)이 생성된다. subplot 명령어는 numrows, numcols, fignum를 지정하는데 여기에서 fignum는 범위가 1에서부터 numrows*numcols까지이다. numrows*numcols<10이면 subplot 명령어 안의 쉼표는 선택적이다. 그래서 subplot(211)subplot(2,1,1)과 동일하다. 얼마든지 하부도표와 축을 만들 수 있다. 즉 사각형 격자가 아니라, 축을 손수 배치하고 싶으면, axes 명령어를 사용하세요. axes([left, bottom, width, height])로 위치를 지정할 수 있다. 여기에서 모든 값은 분수 좌표이다 (0에서 1까지). axes_demo.py에서 손수 축을 배치하는 예를 보고 line_styles.py 에서 여러 하부도표로 작업하는 예를 보자.

그림 번호를 증가시키면서 여러번 figure를 호출하면 여러 그림을 만들 수 있습니다. 물론, 각 그림에는 얼마든지 원하는 만큼 축과 하부도표가 담길 수 있다.

from pylab import *

figure(1)                # 첫 그림
plot([1,2,3])
figure(2)                # 두번째 그림
plot([4,5,6])

figure(1)                # figure 1 current
title('Easy as 1,2,3')   # figure 1 title
show()
clf로 현재 그림을 지울 수 있다. 그리고 cla로 현재 축을 지울 수 있다.

텍스트 작업하기

모든 텍스트 명령어는 (xlabel, ylabel, title, 그리고 text) 선택적인 키워드 인자 또는 사전을 받아 폰트 특성을 지정한다. matplotlib에서 폰트 특성을 지정하는데 세가지 방법이 있다: setp를 사용한 핸들 그래픽 호출과 객체 지향적 방법 그리고 폰트 사전이 그것이다.

text 명령어는 Text 실체를 돌려준다 (또는 여러 텍스트 객체가 생성되면 대신에 실체 리스트를 돌려준다). 그리고 다음과 같이 폰트 속성을 설정할 수 있다; 이 이름들은 matlab의 텍스트를 위한 그래픽 처리와 호환된다.

특성
alpha 0-1 비율의 알파 투명도
color matplotlib 색상 인자
fontangle italic | normal | oblique
fontname Sans | Helvetica | Courier | Times | Others
fontsize 폰트 크기, 예 10
fontweight normal | bold | light 4
horizontalalignment left | center | right
rotation horizontal | vertical
verticalalignment bottom | center | top

텍스트의 정렬과 인쇄방향을 제어하는 법은 align_text 예제를 참고하자.

다음은 텍스트를 도표에 추가하는 예이다

간단한 텍스트 처리

from pylab import *
plot([1,2,3])
xlabel('time')
ylabel('volts')
title('A line')
show()

그래픽 처리(handle graphics)로 텍스트 특성 제어하기

텍스트 특성을 바꾸고 싶고 matlab 그래픽 처리를 사용하고 싶으면, setp 명령어를 사용하여 위의 테이블에 나열된 특성을 설정할 수 있다. 예를 들어, 빨간색 볼드 xlabel을 만들고 싶으면, 다음과 같이 하면 된다.

t = xlabel('time')
setp(t, color='r', fontweight='bold')
설정은 텍스트 실체를 담은 리스트에도 작동한다. 다음은 모든 눈금 라벨의 특성을 바꾼다.
labels = getp(gca(), 'xticklabels')
setp(labels, color='r', fontweight='bold')

객체 메쏘드를 사용하여 텍스트 제어하기

setp 명령어는 그냥 Text 객체의 set 메쏘드를 포장했을 뿐이다. 실체 메쏘드를 사용하고 싶으면, 그냥 텍스트 특성 앞에다 set_를 붙여서 보통의 파이썬 실체 메쏘드를 호출하면 된다. 다음과 같이 말이다

t = xlabel('time')
t.set_color('r')
t.set_fontweight('bold')

kwargs와 dicts로 텍스트 제어하기

모든 텍스트 명령어는 선택적으로 사전과 키워드 인자를 받아 폰트 특성을 제어한다. 예를 들어, 기본 폰트 테마를 설정하고 싶고 주어진 텍스트 명령어에 대하여 개별 특성들을 오버라이드 하고 싶으면, 다음과 같이 하면 된다.

사전을 사용하여 폰트 제어하기

from pylab import *
font = {'fontname'   : 'Courier',
        'color'      : 'r',
        'fontweight' : 'bold',
        'fontsize'   : 11}

plot([1,2,3])
title('A title', font, fontsize=12)
text(0.5, 2.5, 'a line', font, color='k')
xlabel('time (s)', font)
ylabel('voltage (mV)', font)
show()

이제, 모든 텍스트는 기본 테마가 있으며, 이는 사전 font (bold, Courier, red, 11 point)에 의하여 설정되지만, 키워드 인자를 건네면 개별 테스트 조각마다 선택적으로 특성을 오버라이드 할 수 있다. 예를 들어 text 명령어는 색상 문자열 'k'로 검정색을 사용한다.

수학 표현식 작성하기

표현식에 TeX 조판을 사용할 수 있다; 사용법과 요구조건 그리고 후방 정보에 관해서는 mathtext 문서를 참조하세요.

텍스트는 무엇이든 수학 텍스트를 사용할 수 있다. 날 문자열을 사용할 필요가 있다 (따옴표 앞에 'r'을 둠), 그리고 문자열 텍스트 주위에 달러 사인을 두를 필요가 있다. TeX에서 처럼 말이다. 보통의 텍스트와 mathtext는 같은 문자열에 엮을 수 있다.

Mathtext는 Bakoma Computer Modern 폰트나 STIX 폰트 또는 여러분이 제공한 Unicode 폰트를 사용한다. mathtext 폰트는 맞춤 변수 "mathtext.fontset"로 설정할 수 있다.

# 평범한 텍스트
title('alpha > beta')

# math 텍스트
title(r'$\alpha > \beta$')
윗첨자와 아랫첨자를 만들려면 다음과 같이 '_' 심볼과 '^' 심볼을 사용하자.
title(r'$\alpha_i > \beta_i$')
또 수 많은 TeX 심볼을 사용할 수도 잇다. symbols, as in \infty, \leftarrow, \sum, \int; 완전한 목록은 mathtext를 참조하자. over/under subscript/superscript 스타일 역시 지원한다. 0부터 무한대까지 x_i의 합을 작성하려면 다음과 같이 할 수 있다

text(1, -0.6, r'$\sum_{i=0}^\infty x_i$')
수학 심볼에 대한 기본 폰트는 italics이다. 폰트를 바꾸려면, 예를 들어, 로만 폰트로 "sin"을 작성하려면, 다음과 같이 텍스트를 font 명령어로 둘러싸자.
text(1,2, r's(t) = $\mathcal{A}\mathrm{sin}(2 \omega t)$')
더 좋은 것은 로만 폰트로 식자된 함수 이름은 많이 사용되므로 지름길이 있다. 그래서 위의 표현식은 다음과 같이 작성할 수 있다:
text(1,2, r's(t) = $\mathcal{A}\sin(2 \omega t)$')
여기에서 "s"와 "t" 변수는 이택릭 폰트(기본값)이고, "sin"은 로만 폰트, 그리고 and the 진폭 "A"는 손글씨체(caligraphy) 폰트이다. 폰트 선택은 Roman \mathrm, italics \mathit, caligraphy \mathcal, 그리고 typewriter \mathtt이다. STIX 폰트를 사용한다면 다음과 같이 blackboard (double-struck) \mathbb, circled \mathcircled, Fraktur \mathfrak, script (cursive) \mathscr 그리고 sans-serif \mathsf를 선택할 수도 있다.

다음 악센트가 지원된다: \hat, \breve, \grave, \bar, \acute, \tilde, \vec, \dot, \ddot. 모두 구문이 같다. 예를 들어 오버바를 만들려면 \bar{o} 또는 우물라우트를 만들려면 \ddot{o}로 하면 된다.

math 텍스트 사용하기

from pylab import *
t = arange(0.0, 2.0, 0.01)
s = sin(2*pi*t)
plot(t,s)
title(r'$\alpha_i > \beta_i$', fontsize=20)
text(1, -0.6, r'$\sum_{i=0}^\infty x_i$', fontsize=20)
text(0.6, 0.6, r'$\mathcal{A}\mathrm{sin}(2 \omega t)$',
     fontsize=20)
xlabel('time (s)')
ylabel('volts (mV)')
savefig('mathtext_tut', dpi=50)
show()

상호대화적 항해

모든 그림 창에는 항해 툴바라 따로온다. 이 툴바는 데이터 세트를 항해하는데 사용된다. "classic" 고전 툴바 또는 "toolbar2" 최신(newfangled) 툴바를 선택할 수 있는데 matplotlibrc 파일에다 toolbar 설정을 하면 된다. 아주 방대한 데이터 세트 작업을 상호대화적으로 하고 싶다면, matplotlib는 데이터 클리핑을 지원한다. 데이터는 활성 뷰포트에 도표되기 전에 numerix로 클립된다. 그래서 아주 방대한 데이터 세트가 있어도, 전체를 도표하고, 제한 창을 작은 범위로 설정한 다음 상호대화적으로 데이터를 스크롤해 가면서 훌륭하게 갱신할 수 있다. 본인은 matplotlib로 EEG 뷰어를 작성했는데 (스크린샷 참조) 보통 25 MB 데이터 세트를 도표하는데 800 MHz PC에서 양호한 성능을 보였다. 긴 데이터를 제한된 데이터 창으로 보는 예는 matplotlib 소스에 따라오는 stock_demo.py 예제를 참조하자 -- 60일 중에 앞 3일간만 분단위로 인텔사와 애플사에 대한 주식 시황이 최초로 뷰포트에 나타난다. 이 예제에서 데이터 클리핑은 명시적으로 활성화 시켜야 하는 특징이다.

고전적 툴바

도표된 축을 조합하여 X 축과 Y을 따라 팬하고 줌할 수 있다. 휠마우스가 있다면, 양방향으로 이동시킬 수 있다. 콘트롤 위에서 휠을 스크롤하면 된다. 예를 들어, 휠 마우스는 왼쪽 오른쪽 화살표 버튼 중 하나 위에서 스크롤하면 좌우로 팬하는데 사용할 수 있다. 그래서 x-축을 좌우로 팬하기 위해 마우스를 이동시킬 필요가 없다. 휠 마우스가 없다면 하나 사자!

그림의 아래에 있는 콘트롤에 'All'이라고 씌여 있는 왼쪽 위젯은 드롭 다운 메뉴로서 콘트롤이 영향을 미칠 축을 선택하는데 사용된다. 축을 all, none, single, 또는 조합해서 선택할 수 있다. 첫 네개의 콘트롤은 x 축을 기준으로 좌 우로 늘리거나 축소 확대하는데 사용된다. 두 번째 세트는 y축을 따라 위 아래로 늘리거나 축소 확대하는데 사용된다. 나머지 버튼은 그림을 다시 그리거나, 그림을 (PNG 또는 JPEG로) 저장하거나 또는 그림 창을 닫는데 사용된다.

toolbar2

toolbar2 버튼은 고전적 matplotlib 툴바와 아주 다르게 행위한다. (안그러면 뭐하러 새로 툴바를 도입할까!) 앞으로 뒤로 버튼이 시각적으로 비슷하지만 말이다. 자세한 것은 아래를 참고하자.

Forward 버튼과 Back 버튼은 웹 브라우저의 앞으로 뒤로 버튼과 비슷하다. 앞서 정의된 뷰창과 현재 창을 앞으로 뒤로 왔다갔다 하는데 사용된다. 팬 버튼과 줌 버튼을 사용하여 다른 어느 곳엔가 이미 항해를 하지 않았다면 아무 의미가 없다. 이는 웹 브라우저에서 새로 페이지를 방문하기 전에 뒤로 가려고 하는 것과 비슷하다 -- 당연히 아무 일도 일어나지 않는다. Home 버튼은 언제나 데이터의 첫, 기본 창으로 데려다 준다. Home, >Forward 그리고 Back 버튼에 대하여 데이터 창이 웹 페이지인 웹 브라우저라고 생각하자. 새로 뷰를 정의하려면 "pan and zoom to rectangle"을 사용하자.

Pan/Zoom 버튼은 두 가지 모드가 있다: pan and zoom. 이 툴바 버튼을 클릭하여 이 모드를 활성화시키자. 다음 마우스를 축의 아무곳에나 두자.

  • 팬 모드: 왼쪽 마우스 버튼을 누른채로, 새 위치로 끌고 간다. 버튼을 놓으면, 누른 위치에 있던 데이터가 놓은 위치로 이동한다. 패닝중에 'x' 또는 'y'를 누르면, 이동은 각각 x 축이나 y 축으로 제한된다.
  • 줌 모드: 오른쪽 마우스 버튼을 누른채로, 새 위치로 끌고 간다. 오른쪽으로 이동한 비율에 맞게 x 축이 확대되고 왼쪽으로 이동한 비율에 맞게 축소된다. yaxis 그리고 위/아래 이동에도 똑같이 적용된다. 줌을 시작할 때 마우스 아래의 점은 그대로 움직이지 않기 때문에, 그림에서 임의의 점까지 줌할 수 있다. 수정 키로 'x'나 'y' 또는 'CONTROL'을 누르면 줌을 각각 x 축이나 y 축 또는 고정 화면 비율로 제한할 수 있다.
사각형으로 확대 버튼: 이 툴바 버튼을 클릭해서 이 모드를 활성화시키자. 마우스를 축 어딘에게 올려놓고 왼쪽 마우스 버튼을 누르자. 버튼을 누른채로 새 위치로 끌고 가서 놓자. 방금 정의한 사각형까지 축뷰 제한이 줌된다. 또한 이 모드에서 오른쪽 버튼으로 실험적인 '사각영역까지 줌 채움(zoom out to rectangle)'이 지원되는데, 줌채움 사각영역에 의하여 정의된 구역에 전체 축을 배치한다.

세부도표 설정 이 도구를 사용하여 세부도표의 매개변수를 설정한다: 행 사이의 그리고 열 사이의 상하좌우 공간을 설정할 수 있다.

저장: 이 버튼을 클릭하여 파일 저장 대화상자를 띄우자. 모든 *Agg 백엔드는 다음 이미지 유형을 저장하는 법을 안다: PNG, PS, EPS, SVG. 현재 Agg에서 JPEG, TIFF (표준 wx 백엔드와 gtk 백엔드는 이런 유형을 처리함)은 지원되지 않는다. matplotlib/agg + PIL의 조합으로 agg 이미지를 다른 포맷으로 저장할 수 있다. 여러분을 위해 요리법을 제공할 수 있지만, 본인은 PNG를 JPG와 TIFF 보다 더 선호한다. 이 때문에 이런 이미지 포맷을 agg에서 지원하기 위해 크게 노력하지 않았다.

새로운 toolbar2

matplotlib 재단하기

matplotlib은 rc 환경구성 파일로 matplotlibrc을 사용한다. 설치시 이 파일은 표준 배포 경로에 배치되는데, 예를 들어 윈도우즈라면 C:\Python23\share\matplotlib\matplotlibrc, 또는 리눅스 류라면 /usr/local/share/matplotlib/matplotlibrc이 그 위치가 된다. matplotlib을 설치할 때마다, 이 파일을 덮여 씌여지므로, 맞춤 설정이 저장되기를 원한다면, 이 파일을 HOME 디렉토리로 옮기고 HOME 환경 변수에 설정하자.

matplotlib에 있는 거의 모든 특성의 기본값을 제어할 수 있다: 그림 크기와 dpi, 라인 두께, 컬러와 스타일, 축, 축과 격자 특성, 텍스트와 폰트 특성 등등. 파일의 포맷은 안에 설명되어 있으므로, 자세한 정보는 matplotlibrc 안을 들여다 보자.

파이썬 스크립트나 쉘에서 상호대화적으로 rc 명령어를 사용하여 동적으로 기본 값을 바꿀 수도 있다. 예를 들어 기본 라인 특성을 바꾸려면, 다음과 같이 할 수 있다

  >>> rc('lines', linewidth=2, color='r')
기본 라인은 더 두꺼워지고 빨간색이 된다. backend, numerix, interactive, toolbar, timezone 그리고 datapath를 제외하고 모든 rc 매개변수들은 이런식으로 동적으로 맞춤재단이 가능하다. 더 자세한 정보는 rc를 참조하자.

축 특성 제어하기

axessubplot 명령어는 생성된 Axes 실체를 돌려주고, 그를 사용하여 축의 특성을 제어할 수 있다. 예를 들어 ticklines, ticklabels, gridlines, 등등을 Axis API를 통하여 set 메쏘드를 호출하면 제어할 수 있다. 그렇지 않고 matlab의 그래픽 처리 명령어가 더 좋으면, setp를 사용하여 축 특성을 제어할 수도 있다.

subplot(111)
plot([1,2,3])
glines = getp(gca(), 'gridlines')
# gridlines을 푸른색으로 바꾸고 더 두껍게 만든다
setp(glines, 'color', 'b', 'linewidth', 2)

# patches.Rectangle 실체가 사각형 축 프레임의
# 줄 두께를 증가시키도록 만든다
frame = gca(gca(), 'frame')
setp(frame, 'linewidth', 2)

본인이 여러 세부도표가 있을 때 도표 작업중에 많이 마주치는 한가지 작업이 있다. 비율이 같을 경우 가장 낮은 세부도표만 제외하고 모든 세부도표에서 xticklabel을 비활성화시키고 싶은 경우가 종종 있다. 다음은 핸들 그래픽(handle graphics)으로 처리하는 방법이다; gca는 현재 축의 핸들을 돌려준다는 것을 기억하자

subplot(211)
plot([1,2,3], [1,2,3])
setp(gca(), xticklabels=[])

subplot(212)
plot([1,2,3], [1,4,9])
실체 메쏘드도 마찬가지다
a1 = subplot(211)
plot([1,2,3], [1,2,3])
a1.set_xticklabels([])

subplot(212)
plot([1,2,3], [1,4,9])

상호대화 쉘 사용하기

파이썬 쉘에서 상호대화적으로 matplotlib을 사용할 수 있다. 추천하는 파이썬 쉘은 ipython이다. 이 쉘은 명시적으로 모든 matplotlib 백엔드를 지원한다. pylab 옵션을 사용하면 된다.

다른 상호대화 환경에서는 일부 벡엔드와 IDE가 호환되지 않는 경우가 있다. 왜냐하면, 그런 경우 다른 GUI 사건 처리자를 사용하기 때문이다. matplotlib를 IDE에서 사용하고 싶다면, 백엔드 문서에서 호환 정보를 참고하시기를 바란다. 표준 파이썬 쉘이라면 TkAgg 벡엔드를 사용해야 한다. 다른 백엔드나 쉘 또는 IDE에서 상호대화적으로 작업하려면, 백엔드상호대화적 이라는 문서를 참고하자.

사건 처리

데이터를 시각화할 때, 사용자로부터 상호대화적으로 입력을 얻는 것이 종종 도움이 된다. 모든 그래픽 사용자 인터페이스(GUIs)는 사건 처리를 제공하여 키가 눌렸는지 마우스가 어디에 위치하는지 버튼이 클릭되었는지를 결정한다. matplotlib은 수 많은 GUI를 지원한다. 그리고 pylab 인터페이스의 connect 메쏘드와 disconnect 메쏘드를 통하여 GUI 사건 처리를 지원한다. API 사용자라면 아마도 GUI의 사건 처리를 직접 사용하고 싶겠지만, 선택적으로 FigureCanvas.mpl_connect 메쏘드를 사용한다.

matplotlib는 역호출 사건 처리 메커니즘을 사용한다. 기본 아이디어는 청취하고 싶은 사건을 등록하고, 그 사건이 일어날 때 그림 캔버스가 사용자 정의 함수를 호출하는 것이다. 예를 들어, 사용자가 마우스를 그림 어디에 클릭했는지 알고 싶다면, 다음과 같이 함수를 정의하면 된다

def click(event):
    print 'you clicked', event.x, event.y

# 사건 처리자와 함께 이 함수를 등록한다.
connect('button_press_event', click)
그러면 사용자가 그림 캔버스 위를 클릭할 때마다, 정의해 놓은 함수가 호출되고 MplEvent 실체가 반환된다. 이벤트 실체는 다음과 같은 속성이 정의되어 있다.
특성 의미
x x 위치 - 캔버스 왼쪽으로부터 떨어진 픽셀수
y y 위치 - 캔버스 아래로부터 떨어진 픽셀수
button 버튼 눌림 : None, 1, 2, 3
inaxes 마우스가 축 위에 있을 때의 Axes 실체 (또는 None)
xdata 데이터 좌표에서 마우스의 x 좌표 (마우스가 축위에 있지 않으면 None)
ydata 데이터 좌표에서 마우스의 y 좌표 (마우스가 축위에 있지 않으면 None)
name 이벤트의 문자열 이름
canvas 이벤트가 일어나는 FigureCanvas 실체
key 키 눌림, 'a', 'b', '1' 등등. 'control'과 'shift'도 기록
다음 이벤트에 접속할 수 있다: 'button_press_event', 'button_release_event', 'motion_notify_event'. 다음은 마우스 움직임에 따라 데이터 좌표로 마우스 위치를 얻는 예이다.
from pylab import *

plot(arange(10))

def on_move(event):
    # x 와 y 좌표를 픽셀 단위로 얻는다
    x, y = event.x, event.y

    if event.inaxes:
        print 'data coords', event.xdata, event.ydata

connect('motion_notify_event', on_move)

show()

날짜 도표

matplotlib는 파이썬 datetime 객체와 부동소수점수 사이를 변환함으로써 날짜 도표를 처리하는 변환 함수를 제공한다. 이 숫자들은 그레고리안 달력 UTC 시간으로 날짜를 나타낸다. UTC를 사용하는 장점은 일광 절약 시간이나 시간대 격차가 없다는 것이다. 그 때문에 시간 계산이 편리하다. 그렇지만, 이는 그저 matplotlib가 사용하는 내부 포맷일 뿐이며, 시간대(timezone)가 지원된다. 지원되는 날짜의 범위는 파이썬의 datetime 모듈과 같이: 0001-9999년까지이다

matplotlib 0.63 이전이라면 날짜가 기원 (1972) 이후로 초단위로 표현되며 시간대(timezone)가 지원되지 않는다. 이제 datetime 객체를 사용하여 시간 범위를 확장하도록 코드가 재작성되어 날짜 도표가 작동하고 시간대를 지원한다. 그리하여 dateplotting은 python2.3이 필요하다. 다음 섹션을 세심하게 살펴보고 API_CHANGES를 참고하여 예전 코드를 이주시키려면 어떤 변화가 요구되는지 알아보자. 또 주목하자. 이름이 같은 날짜 위치지정자 함수는 대부분 이제 (그리고 더욱 일반적으로) 구성자 구문이 다르다.

세가지 datetime 변환 함수가 있다: date2numnum2date 그리고 drange가 그것이다. date2num 함수는 파이썬의 datetime(또는 datetimes 연속열)을 받아 부동소수점수 또는 부동소수점 연속열을 돌려준다. num2date 함수는 반대의 일을 한다. drange 함수는 시작 날짜와 종료 날짜 그리고 datetime 시간증분(timedelta) 객체를 받아 부동소수점수 연속열을 돌려준다.

date1 = datetime.date( 1952, 1, 1 )
date2 = datetime.date( 2004, 4, 12 )
delta = datetime.timedelta(days=100)
dates = drange(date1, date2, delta)
plot_date 함수는 부동소수점수 날짜에 대하여 일련의 y-values 값들을 찍는데 사용된다. x 축은 그냥 부동소수점수 연속열일 뿐이므로, 쉽게 plot를 사용할 수 있다. 사실, 이 일을 바로 plot_date가 뚜껑 아래에서 해 준다. 유일한 차이점은 plot_date가 날짜 간격 지정자와 날짜 간격 포맷터를 골라서 제시된 날짜의 범위에 기반하여 지능적으로 기본 선택을 시도한다. 맞춤 날짜 지정자와 포맷터를 사용하고 싶다면, 그냥 간단하게 날짜 도표용 plot 명령어를 사용하면 된다.

# 무작위로 y 값을 만든다
s = rand(len(dates))
plot_date(dates, s)

dateutils로 날짜 눈금 지정하기

matplotlib-0.63의 날짜 도표에서 또다른 변화는 강력한 dateutil 꾸러미가 포함되어 날짜 눈금 위치지정을 지원한다는 것이다. dateutil는 matplotlib 배포본에 포함되어 있어서 설치되어 있지 않으면 자동으로 설치된다. dateutil 꾸러미는 반복 규칙(recurrance rules)을 제정하기 위한 rrule 모듈을 제공한다. 그리하여 월요일마다 5PM 시, 매 부활주일마다, 지정된 시간에, 주말 등등마다 눈금을 배치할 수 있다. matplotlib의 모든 날짜 눈금 지정자는 뚜껑 아래에서 rrules를 이용한다 (matplotlib.ticker 그리고 matplotlib.dates에서 날짜 눈금 지정에 관하여 더 자세한 정보를 참고하자).

다음은 매해마다 큰눈금, 매달마다 작은 눈금을 만드는 눈금지정자를 설정하는 예이다.

years    = YearLocator()   # 해마다
months   = MonthLocator()  # 달마다
yearsFmt = DateFormatter('%Y')
ax.xaxis.set_major_locator(years)
ax.xaxis.set_major_formatter(yearsFmt)
ax.xaxis.set_minor_locator(months)
DateFormatter 클래스는 strftime 형식화 문자열을 받는다. 위의 예제는 YearLocatorMonthLocator에 대하여 기본 구성자를 사용하였다. 그러나 이 행위를 맞춤 재단할 수 있다. 예를 들어, 큰 눈금을 5년마다 만들고 작은 눈금을 3, 6, 9, 12월에 만들려면 대신에 다음과 같이 할 수 있다
# 5년마다
years    = YearLocator(5)

# 분기마다
months   = MonthLocator(range(3,13,3))
날짜 눈금 지정자 MinuteLocator, HourLocator, DayLocator, WeekdayLocator, MonthLocator, 그리고 YearLocator가 제공되며, rrule 발생자에 대한 인터페이스가 간단하다. date_demo1.py 예제와 date_demo2.py 예제를 참고하자. 날짜 눈금지정을 완전하게 통제하려면 RRuleLocator 클래스로 자신만의 rrule을 사용하면 된다. date_demo_rrule.py 예제를 참고하자.

간단한 도표

date_demo2.py의 예제 코드.

pytz로 시간대 처리하기

시간대(Timezone)는 pytz 모듈을 통하여 지원된다. 이 모듈은 올슨(Olsen) 데이터베이스 시간대의 546항을 구현한 파이썬 datetime 모듈의 tzinfo 구현을 사용한다. pytz는 matplotlib 배포본에 포함되어 있으며 가지고 있지 않다면 자동으로 설치된다. 그리하여 짐바브웨에 살면서 matplotlib로 런던이나 뉴욕의 금융 동향을 도표할 수 있다. 일광 절약 시간 같은 괴이한 것들을 정확하게 처리한다. 기본 시간대는 matplotlibrc 파일에서 timezone 매개변수로 설정한다. 시간대는 pytz.timezone 구성자가 받을 수 있는 문자열로 지정된다. 예를 들어 'US/Eastern'이나 'Europe/London' 같이 말이다. matplotlib에 따라오는 rc 파일에 지정된 기본 시간대는 'UTC'이다. matplotlib는 디렉토리마다 rc 파일을 지원하므로, 여러분의 시간대 말고 또다른 시간의 프로젝트가 있을 경우, rc 파일을 작업 디렉토리에 두면 그 프로젝트가 기본 시간대로 사용할 수 있다.

drange와 date2num을 제외하고 모든 matplotlib 날짜 눈금 클래스와 함수는 선택적인 인자 tz를 받는데 이는 tzinfo 실체이다; drange와 date2num가 이 인자를 사용하지 않는 이유는 공급된 datetime 실체의 tzinfo로부터 정보를 추론할 수 있기 때문이다. tz가 None (기본값)이라면 rc 값이 사용된다. date_demo_convert.py에서 시간대 정보를 사용한 날짜 도표의 예를 살펴보자.


Powered by
YAPTU!
Matlab® is a registered trademark of The MathWorks