LaTeX

Matplotlib 으로 플로팅 하기

ForceCore 2010. 11. 16. 20:56
#!/usr/bin/env python2
import numpy as np
import matplotlib.pyplot as plt

# pdf saving.
from matplotlib.backends.backend_pdf import PdfPages

# Allow LaTeX rendering.
from matplotlib import rcParams
rcParams['text.usetex']=True
rcParams['text.latex.unicode']=True

# needed for formatting Y axis
from matplotlib.ticker import FuncFormatter
# Matplotlib font manager
import matplotlib.font_manager as font_manager




# load data
f = open( 'mot-opt-leaf.dat' )
leaf = np.loadtxt( f, delimiter='\t' )
f.close()
f = open( 'mot-opt-all.dat' )
alles = np.loadtxt( f, delimiter='\t' )
f.close()

# separate CSV data
t_l, i_l = zip(*leaf)
t_a, i_a = zip(*alles)

# axis labling
plt.xlabel( "Time (ps)" )
plt.ylabel( "Peak Current (\mu A)" )

# axis
plt.xlim( 0.5, 4.5 )
plt.ylim( -50, 700 )

# do plotting
p_leaf, = plt.plot( t_l, i_l, color='k' )
p_all, = plt.plot( t_a, i_a, color='b', linestyle='--' )

# draw legend
# at lower center
plt.legend( [p_leaf,p_all], ["Leaf Nodes","All Nodes"], loc=1 )

# remove margins
plt.subplots_adjust( left=0.1, right=0.9, bottom=0.1, top=0.9 )

if 0:
    # show
    plt.show()
else:
    # or save
    pp = PdfPages('mot-opt.pdf')
    pp.savefig()
    pp.close()
위 코드는 전형적인 x-y 플로팅을 한다. dat파일에서 (csv를 읽게 고칠 수도 있음... np.loadtxt( f, delimiter='\t' ) 여기 delimiter를 ',' 로 바꾸면.) 데이터를 읽어서 그래프를 그려줌. 끝에 있는 if 0: 에서 0을 1로 바꾸면 화면에 보여주는 대신 PDF저장은 하지 않을 것이다.

플로팅을 실제로 하려면, 그저 여느 python2 스크립트처럼 실행하는 것만으로 충분하다.

결과물:


상당히 예쁜 편. LaTeX 코드도 넣을 수 있다는 점이 마음에 들어서 Matplotlib으로 낙찰. 그리고 Python 언어로 되어 있어서 지저분한 gnuplot 코드보단 나은지도.

예제 Makefile
PDFS=mot-opt.pdf mot-subopt.pdf
PYS=mot-opt.py mot-subopt.py
.SUFFIXES: .pdf .py

all: $(PDFS)

.py.pdf:
    python2 $<
새로 업데이트 된 py 스크립트만 적절히 스캔해서 실행해주어, 결과물인 PDF파일이 생성될 수 있도록 해준다.

PyLab 인터페이스를 쓰면 더 쉬운 플로팅이 가능하니 참고할 것.