파이썬 팁

파이썬 통해 불러온 데이터로 그래프 그리기 - matplotlib, 그래프크기조절, subplot 등 예제설명

gomming 2020. 9. 26. 00:18

python의 아주아중 유명한 라이브러리인 matplotlib을 이용해 볼께요

Anaconda 개발환경으로 설치하셨다면, 기본설치가 되어 있어서 바로 이용하실 수 있어요 !

 

import sys, os import matplotlib.pyplot as plt

 

라이브러리를 위와 같이 불러와서 plt 입력으로 기능을 이용할 수 있도록 했어요

 

path = 'C:/Users/Roha/Downloads' 
fname1 = "GM11.AT2" fname2 = "GM12.AT2" 
fpath = os.path.join(path,fname1) 
fpath2 = os.path.join(path,fname2)

 

이제 GM11, GM12라는 두 개의 지진 데이터를 불러올거에요

파일의 경로를 os모듈을 이용하서 만들어 봤어요!

f = open(fpath, 'r')
lines = f.readlines()
GM = []
for line in lines:
    try:
        GM.append(float(line))
    except ValueError:
        pass
f.close()

f = open(fpath2, 'r')
lines = f.readlines()
GM2 = []
for line in lines:
    try:
        GM2.append(float(line))
    except ValueError:
        pass
f.close()

두 개 파일의 데이터를

GM, GM2 리스트에 각각 첨부시켰어요.

 

텍스트 파일의 내용은 문자열로 불러오기 때문에 float을 써서 숫자만 소수로 타입 변환한 뒤 첨부시켰습니다.

 

print(len(GM),len(GM2))

 

이렇게 각 데이터의 길이를 출력해보면

8000 4430

이렇게 나타나요. 길이가 서로 달라요

 

데이터의 x축 값은 0.05s 간격인데요. 데이터의 길이만 큼 x축 리스트를 만들어 줍니다.

numpy를 이용하면 더 간단하지만, 그냥 for문으로 리스트를 만들어도 쉽습니다.

T = []
for i in range(len(GM)):
    T.append(i*0.005)
T2 = []
for i in range(len(GM2)):
    T2.append(i*0.005)

 

이렇게 하면 각 데이터의 길이만큼 x축 데이터가 생성되어 T, T2리스트로 작성 되요

 

print(len(T),len(T2))

 

8000 4430 이렇게 출력 된답니다.

 

이제 matplotlib의 기본 기능을 이용해서 그래프를 그려보겠습니다.

fig = plt.figure()
ax = fig.add_subplot(1,1,1)
plt.title('Ground motion')
plt.plot(T,GM, '-c', label='GM11')
plt.plot(T2,GM2, '-r', label='GM12')
plt.xlabel('time')
plt.ylabel('Acceleration, G')
plt.grid(True)
ax.legend()
plt.savefig('GM11_12.pdf',dpi=300)

먼저 fig라는 이름으로 그려질 전체 그래프의 이름을 지어줘요

 

ax는 subplot이라는 기능으로 작성할 첫번째 그래프의 이름이랍니다.

우선 하나의 그래프를 그려볼게요

 

add_subplot(1,1,1) 이라고 쓰면

총 1행 1열 그래프에서 첫번째 그래프라는 의미에요

plt.title 로 그래프의 제목을 입력할 수 있어요

plt.plot을 통해 그래프 내용과 속성을 정의할 수 있어요

plt.plot을 여러번 써주면 하나의 그래프에 여러개의 커브를 포함시킬 수 있어요

plt.xlabel

plt.ylabel 을 이용하여 각 축의 라벨을 작성해 줄 수 있어요 !

plt.grid를 통해 그래프내에 그리드 라인을 넣어 줄 수 있어요

ax.legend 통해 레전드를 표시해 줄 수 있답니다.

 

마지막으로 plt.savefig 기능으로 그래프를 이미지 파일로 저장할 수 있어요

pdf, jpg, png 등 다양한 포멧으로 저장할 수 있어요

dpi 속성을 이용하여 품질을 정해줄 수 있답니다. 상당히 고품질의 이미지를 얻으실 수 있어요

 

 

pdf로 저장된 이미지에요

그럼 이번엔 여러 그래프를 그려볼게요

 

plt.rcParams['figure.figsize'] = [20,18]

fig = plt.figure()

ax = fig.add_subplot(3,1,1)
plt.title('Ground motion')
plt.plot(T,GM, '-c', label='GM11')
plt.plot(T2,GM2, '-r', label='GM12')
plt.xlabel('time')
plt.ylabel('Acceleration, G')
plt.grid(True)

#ax.legend()


ax1 = fig.add_subplot(3,1,2)
plt.title('Ground motion')
plt.plot(T,GM, '-c', label='GM11')
plt.xlabel('time')
plt.ylabel('Acceleration, G')
plt.grid(True)


ax2 = fig.add_subplot(3,1,3)
plt.title('Ground motion')
plt.plot(T2,GM2, '-r', label='GM12')
plt.xlabel('time')
plt.ylabel('Acceleration, G')
plt.grid(True)

plt.savefig('GM11_12.pdf',dpi=300)

 

3행 1열의 공간에 3개의 그래프를 채워 넣었어요. 공간을 비워두면 빈상태로 출력 되요 !

 

그리고 아래 코드를 이용해서 그래프의 크기를 조절하였여요

plt.rcParams['figure.figsize'] = [20,18]

 

 

그래프 공간을 나누는 기능은 gridspec이란 방법으로도 적용할 수 있는데요

 

import matplotlib
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

fig3 = plt.figure(constrained_layout=True)
gs = fig3.add_gridspec(3, 3)
f3_ax1 = fig3.add_subplot(gs[0, :])
f3_ax1.set_title('gs[0, :]')
f3_ax2 = fig3.add_subplot(gs[1, :-1])
f3_ax2.set_title('gs[1, :-1]')
f3_ax3 = fig3.add_subplot(gs[1:, -1])
f3_ax3.set_title('gs[1:, -1]')
f3_ax4 = fig3.add_subplot(gs[-1, 0])
f3_ax4.set_title('gs[-1, 0]')
f3_ax5 = fig3.add_subplot(gs[-1, -2])
f3_ax5.set_title('gs[-1, -2]')
plt.savefig('gridspec.pdf',dpi=300)

 

이렇게 그래프가 차지하는 공간을 아주 자유롭게 지정해 줄 수 있어요 !. !

 

 

모두들 즐거운 코딩생활 하세요 ~

 

 

#os.path.join #append #파일불러오기 #리스트에추가하기 #float

#try #except #ValueError #예외처리 #add_subplot #subplot #plt #savefig

#그래프저장 #그래프품질 #pdf저장 #dpi #legend #grid #xlabel #ylabel

#plot #fingure #여러개그래프 #하나의그래프창에 #고품질

#gridspec