matplotlib을 활용한 contour 그림 그리기 테스트 by 바죠


matplotlib를 활용한 contour 그림 그리기 연습
matplotlib 웹페이지 : http://matplotlib.sourceforge.net/
http://www.scipy.org/Cookbook/Matplotlib
http://en.wikipedia.org/wiki/Matplotlib

matplotlib, Python 언어를 아는 사람들에게는 매우 편리하게 되어 있는 그림 그리기용 라이버러리이다. 파이썬 언어를 모르면 공부하고 와라라고 매뉴얼에 적혀있다. 파이썬 언어를 아시는 분들에게는 추천할 만한 수준의 라이버러리이다. 결국 하나의 그림은 matplotlib를 활용하고 Python 스크립트를 작성하므로써 완성되게 되어 있다. 파이썬을 이용하기 때문에 이를 모르면 matplotlib를 사용하는데 상당한 제약을 느낄 수 있다. 결국, 파이썬을 사용하는 사람들만의 전유물이 되고 만다. 하지만, 초급 수준의 파이썬 언어만 알아도 사용이 가능하다.

gnuplot을 배우는 수준의 노력을 들이면 쉽게 matplotlib를 활용한 그림을 그릴 수 있다. 그누플롯(gnuplot)도 스크립트로 그림을 그릴 수 있다. 실제로 많은 예제 스크립트들이 온라인상에 있다. 결국, matplotlib는 matlab, gnuplot의 영향을 받았다고 볼수 있다. 그누플롯 스크립트들:(http://gnuplot.sourceforge.net/demo_4.0/)  

시간을 돌이켜 보면, gnuplot을 처음 배우는 것 보다는 python공부를 조금 하고, matplotlib 예제를 활용하여 그림그리기를 익히는게 조금 더 낫다고 생각한다. 파이썬을 공부하고 그림을 그리기 때문에 조금 비효율적이라고 생각은 든다. 하지만, 조금 더 장기적인 안목으로 생각하면 이게 확실히 이득이다. 물론, 파이썬 초급자에게는 gnuplot을 시작하여 그림을 그리는것 보다 바로 matplotlib을 활용하여 그림을 그리는게 더 자연스럽다.
users_guide_0.91.2svn.pdf

matplotlib를 활용한 작업환경은 더욱더 이상적이다. 워크스테션, PC 등에서 똑같이 작동한다, Python, numpy만 설치되어 있다면. http://incredible.egloos.com/3607477
(Python을 설치->numpy설치-> matplotlib설치순으로 일이 진행되야 한다.  또한, 복사 작업이 필요하게 된다. matplotlib-0.90.1-py2.5-win32.egg folder ---> Lib\site-packages folder of the python 2.5 installation (통상의 위치 C:\Python25\Lib\site-packages\)) Tex지원, 2D, 3D, multiple plot지원 등 화려한 그림들을 그릴 수 있다. 거의 matlab수준으로.  아래의 그림은 Tex을 지원하는 양식을 나타낸 한 예제이다. 

pylab 모듈을 import하면 numpy, numarray, Numeric 모듈을 사용할 수 있다. 모듈 Numeric이 더이상 개발되지 않기 때문에 numpy를 사용하는것이 바람직하다. http://incredible.egloos.com/3607490


그 동안, 사실, XY 그림들은 xmgrace를 활용하여 그려왔던것이다. 매우 편리하고 강력하다. 하지만, 이 소프트웨어는 contour그림들은 지원하지 않는다. 논문 작업을 하다가 보면 xfig를 활용하여 다수의 그림들을 새롭게 배열하여 하나의 eps를 만드는 작업이 실제로는 필요하다. 추가적인 글들도 삽입할 필요가 있다.
http://incredible.egloos.com/2657517

그림 출처: http://matplotlib.sourceforge.net/screenshots.html


다양한 예제들(http://matplotlib.sourceforge.net/examples/)이 웹에 준비되어 있다. 그것 중 하나를 이용해서 살짝 바꾸어서 그림 하나를 그려 보았다. 데이터를 직접 생성해서 그림을 완성했다. 파일로 부터 읽어 들여서 작업을 할수도 있다. 파이썬으로 모든 작업을 수행한다. 참고:
http://incredible.egloos.com/2985527
-------------------------------------------------------------------------------------------------------------

#!/usr/bin/env python
'''
My first test
'''
from pylab import *


def myexp(x):
    tmp=x
    if x <=-40. : tmp=-40.
    if x >= 40. : tmp= 40.
    return exp(tmp)
def energy(xx):
    x=xx[0]
    y=xx[1]
    grad=[0.]*2
    en=(1.-x**2-y**2)**2+y**2/(x**2+y**2)
    grad[0]=2.*(1.-x**2-y**2)*(-2.*x)-y**2/(x**2+y**2)**2 *(2.*x)
    grad[1]=2.*(1.-x**2-y**2)*(-2.*y)-y**2/(x**2+y**2)**2 *(2.*y)
    return en,grad
def energy2(xx):
    x=xx[0]
    y=xx[1]
    en= 1./100.*( -170.*myexp(-6.5*(0.5+x)**2+11.*(0.5+x)*(-1.5+y)-6.5*(-1.5+y)**2)   \
       +15. *myexp(0.7*(1.+x)**2+0.6*(1.+x)*(-1.+y)+0.7*(-1.+y)**2)  \
       -100.*myexp(-1.*x**2  - 10.*(-0.5+y)**2)  \
       -200.*myexp(-1.*(-1.+x)**2 - 10.*y**2) )
    x5= 0.5e0+x
    y5= -1.5e0 +y
    x1= 1.0e0+x
    y1= -1.0e0+y
    grad=[0.,0.]
    grad[0]= 1.0e0/100.0e0*(-170.*myexp(-6.5*x5**2+11.*x5*y5-6.5*y5**2)*(-13.*x5+11.*y5)  \
        + 15.*myexp(0.7*x1**2+0.6*x1*y1+0.7*y1**2) * (1.4*x1+0.6*y1)   \
        -100.*myexp(-1.*x**2 -10.*(-0.5+y)**2)* (-2.*x )   \
        -200.*myexp(-1.*(-1.+x)**2 -10.*y**2)*(-2.*(-1.+x) ) )
    grad[1]=  1.0e0/100.0e0*(-170.*myexp(-6.5*x5**2+11.*x5*y5-6.5*y5**2)*(11.*x5-13.*y5)  \
        +15.*myexp(0.7*x1**2+0.6*x1*y1+0.7*y1**2)*(0.6*x1+1.4*y1)  \
       -100.*myexp(-1.*x**2 -10.*(-0.5+y)**2)* ( - 20.*(-0.5+y))  \
       -200.*myexp(-1.*(-1.+x)**2 - 10.*y**2)* ( - 20.*y) )
    return en,grad
def energy3(xx):
    x=xx[0]
    y=xx[1]
    grad=[0.]*2
    en=( (x**2-1.)**2 + (y-1.)**2 )*( 1.+(y+1.)**2 )
    grad[0]= ( 2.*(x**2-1.)*(2.*x) )*( 1.+(y+1.)**2 )
    grad[1]= (2.*(y-1.))*(1.+(y+1.)**2)+( (x**2-1.)**2+(y-1.)**2 )*(2.*(y+1.))
    return en,grad



########################################################################################################

rcParams['xtick.direction'] = 'out'
rcParams['ytick.direction'] = 'out'

delta = 0.010
x = arange(-1.5, 1.5, delta)
y = arange(-1.5, 1.5, delta)
X, Y = meshgrid(x, y)
Z=zeros((len(X),len(Y)),Float)
xxtest=[0.]*2
for j in range(len(Y)):
    for i in range(len(X)):
        xxtest[0]=x[i]
        xxtest[1]=y[j]
        en,grad=energy(xxtest)
        Z[j,i] =en
del xxtest


# colormap will be used for the contour lines    cmap=cm.gray
figure()
im = imshow(Z, interpolation='bilinear', origin='lower', cmap=None, extent=(-2,2,-2,2))
levels = arange(-1.0, 4.5, 0.45)
CS = contour(Z, levels, origin='lower', linewidths=2, extent=(-2,2,-2,2))

#Thicken the zero contour.
zc = CS.collections[6]
#setp(zc, linewidth=4)
setp(zc, linewidth=1)

clabel(CS, levels[1::2],  # label every second level
       inline=1,
       fmt='%1.1f',
       fontsize=14)

# make a colorbar for the contour lines
CB = colorbar(CS, shrink=0.8, extend='both')

#title('Lines with colorbar')
hot()  # Now change the colormap for the contour lines and colorbar
flag()

# We can still add a colorbar for the image, too.
CBI = colorbar(im, orientation='horizontal', shrink=0.8)

# This makes the original colorbar look a bit out of place,
# so let's improve its position.

#l,b,w,h = gca().get_position().bounds
#ll,bb,ww,hh = CB.ax.get_position().bounds
l,b,w,h = gca().get_position()
ll,bb,ww,hh = CB.ax.get_position()
CB.ax.set_position([ll, b+0.1*h, ww, h*0.8])


#savefig('my_pot')
show()

-----------------------------------------------------------------------------------------------------------
########################################################################################################

rcParams['xtick.direction'] = 'out'
rcParams['ytick.direction'] = 'out'

delta = 0.010
x = arange(-1.5, 1.5, delta)
y = arange(-1.5, 1.5, delta)
X, Y = meshgrid(x, y)
Z=zeros((len(X),len(Y)),Float)
xxtest=[0.]*2
for j in range(len(Y)):
    for i in range(len(X)):
        xxtest[0]=x[i]
        xxtest[1]=y[j]
        en,grad=energy(xxtest)
        Z[j,i] =en
del xxtest


# colormap will be used for the contour lines    cmap=cm.gray
fig=figure()
im = imshow(Z, interpolation='bilinear', origin='lower', alpha=1., cmap=None, extent=(-2,2,-2,2))
levels = arange(-1.0, 4.5, 0.45)
CS = contour(Z, levels, origin='lower', linewidths=2, extent=(-2,2,-2,2))

#Thicken the zero contour.
zc = CS.collections[6]
#setp(zc, linewidth=4)
setp(zc, linewidth=1)

clabel(CS, levels[1::2],  # label every second level
       inline=1,
       fmt='%1.1f',
       fontsize=14)

# make a colorbar for the contour lines
CB = colorbar(CS, shrink=0.8, extend='both')

#title('Lines with colorbar')
hot()  # Now change the colormap for the contour lines and colorbar
flag()

# We can still add a colorbar for the image, too.
CBI = colorbar(im, orientation='horizontal', shrink=0.8)

# This makes the original colorbar look a bit out of place,
# so let's improve its position.

#l,b,w,h = gca().get_position().bounds
#ll,bb,ww,hh = CB.ax.get_position().bounds
l,b,w,h = gca().get_position()
ll,bb,ww,hh = CB.ax.get_position()
CB.ax.set_position([ll, b+0.1*h, ww, h*0.8])

#hold(False)
#hold(True)
npt=10
for i in range(npt):
    ax=fig.add_subplot(111)
#   ax.annotate('a', xy=(0.1*i, 0.1*i), xytext=(0.1*i,0.1*i), textcoords='figure fraction', horizontalalignment='left', verticalalignment='bottom'  )
    ax.annotate('+', xy=(-1.5+0.1*i, 0.1*i), xytext=(-1.5+0.1*i,0.1*i),  horizontalalignment='left', verticalalignment='bottom'  )

ax.set_xlim(-1.5,1.5)
ax.set_ylim(-1.5,1.5)
#savefig('my_pot.eps')
#savefig('my_pot.png')
show()



 ---------------------------------------
참고:
http://incredible.egloos.com/4162940


PS.


 cd matplotlib-1.0.1
python setup.py build
 python setup.py install




http://incredible.egloos.com/7415285




핑백

덧글

  • DrFaust 2008/02/28 09:10 # 답글

    박사님 블로그에서 많은 걸 배워갑니다. 항상 감사드립니다. :-)
  • 바죠 2008/02/28 09:43 # 삭제 답글

    DrFaust>> 별말씀을 다하시는군요. 제가 감사드립니다.
  • 네오스 2008/05/07 10:59 # 답글

    안녕하세요. 석차옥 교수님방 고준수 입니다. 좋은 글 잘 보고 갑니다.
  • 바죠 2008/05/07 15:57 # 답글

    네오스>> 반갑습니다. 별 내용이 없는 곳이라 조금 민망합니다.
댓글 입력 영역

최근 포토로그