본문 바로가기

과학/실험 & 활동

[파이썬] 지질시대 파이차트 만들기

이번 시간에는 지질시대의 상대적 길이를 직관적으로 확인할 수 있는 파이차트를 만들어보겠습니다.

본 작업은 구글 코랩으로 진행하였으니 참고하시기 바랍니다.

 

우선 필요한 라이브러리를 불러옵니다.

%matplotlib inline
import matplotlib as mpl
import matplotlib.pyplot as plt

 

코랩에서 한글을 이용하기 위해서는 별도의 작업을 해줘야 합니다.

# 코랩에서 한글 설치
!sudo apt-get install -y fonts-nanum
!sudo fc-cache -fv
!rm ~/.cache/matplotlib -rf

검색해보면 !sudo ~~ 에서 sudo가 없는 코드를 사용해도 무방한 것 같긴 합니다만, 잘 몰라서 그냥 이렇게 했습니다.

만약 실행했을 때 한글이 깨져서 나오시면 '런타임 다시시작'을 해보세요. 

이유는 모르겠지만 저도 계속 한 번에 나오지는 않더라고요..;;

 

다음으로는 폰트를 지정합니다.

plt.rc('font', family='NanumBarunGothic')
plt.rcParams["font.family"] = "NanumGothic"

이상 기초 작업은 끝났으니 지질시대 파이차트를 그리기 위한 변수를 지정합니다.

n=[45, 25, 5.2, 2.5, 0.66]
x=[]
t=0

n에 들어간 값은 각각 시생누대, 원생누대, 고생대, 중생대, 신생대의 시작 지점입니다.

우리에게 필요한 것은 각각의 지질시대의 길이이므로 이를 계산하는 코드를 넣어줍니다.

name=['시생누대', '원생누대', '고생대', '중생대', '신생대']
for a in n:
    t+=1
    if t<5:
        s=a-n[t]
    else:
        s=a-0
    x.append(s)
print (x)

name 변수에서 각 시대별 이름을 넣고, for 반복문을 이용하여 각 시대의 길이를 계산한 다음, x변수에 추가해주었습니다.

 

다음은 파이차트를 실제로 그려보겠습니다.

구글에서 검색해보면 파이차트 그릴 때 필요한 조건과 명령어들을 잘 정리한 글들이 많으니 활용하면 좋겠습니다.

plt.figure(figsize=(10,10))
plt.pie(x, labels=name, startangle=90, counterclock=False, colors=['orange','wheat','oldlace','darkgoldenrod','goldenrod'])
plt.text(0.32,-1.0,n[1], c='b')  # 25억년 경계 눈금 표시
plt.text(-0.75,0.77,n[2], c='b')  # 5.2억년 경계 눈금 표시
plt.text(-0.4,0.97,n[3], c='b')   # 2.5억년 경계 눈금 표시
plt.text(-0.15,1.02,n[4], c='b')  # 0.66억년 경계 눈금 표시
plt.text(0.8,1.15,'(단위 : 억년)', c='k')
plt.title('지질시대 시간표', size=20)
plt.savefig('hh_detail2.png', bbox_inches='tight', pad_inches=0.1, dpi=300)
plt.show()

핵심 명령어는 plt.pie()입니다. 그 속에 변수와 변수명, 색상 등을 지정합니다.

참고로 startangle은 부채꼴이 그려지는 시작 각도를 지정하는 것이며, counterclock=False로 지정하면 시계 방향 순서로 부채골 영역이 표시됩니다. colors를 지정하지 않으면 기본 디폴트값으로 나오니 귀찮으면 삭제 가능합니다.)

plt.text는 각 시대별 경계의 눈금을 표시하기 위한 명령어이며, plt.text(x좌표, y좌표, 기입할 내용)으로 이루어집니다.

파이차트의 정중앙이 (0,0)에 해당하므로 적절히 위치를 설정해주면 되는데, 다른 방법을 몰라서 그냥 무작정 숫자를 

바꿔가며 작업했습니다. 더 좋은 방법이 분명 있을 것이라 믿지만 모르겠습니다. 

나머지는 단위와 제목 등을 지정하고, 마지막에 plt.savefig('파일명')을 통해 저장하였습니다. 

코랩에서 작업할 경우 코랩의 가상 파일 폴더에 저장되며, 추가로 PC에 저장할 수도 있습니다. 

참고로 반복되는 plt.text()함수를 간단히 하고 싶으면 for 반복문을 사용하여 정리할 수 있습니다.

결과는 위 그림과 같으므로 코드만 넣어놓겠습니다.

plt.figure(figsize=(10,10))
plt.pie(x, labels=name, startangle=90, counterclock=False, colors=['orange','wheat','oldlace','darkgoldenrod','goldenrod'])
def mtext(a,b,c):
  return plt.text(a,b,n[c], c='b')
a=range(0, 4, 1)
tx=[0.32, -0.75, -0.4, -0.15]
ty=[-1.0, 0.77, 0.97, 1.02] 
for fi in a:
  mtext(tx[fi], ty[fi], fi+1)
plt.title('지질시대 시간표', size=20)
plt.savefig('hh_detail3.png', bbox_inches='tight', pad_inches=0.1, dpi=300)
plt.show()

 

다음으로는 파이차트를 조금 꾸며보겠습니다. 

우선 파이차트 내 부채꼴을 분리하고, 각 시대별 비율을 표시하겠습니다.

부채꼴을 떨어뜨리기 위해서는 explode변수를 지정한 후 plt.pid()속에 넣어주면 되며,

각 시대별 비율은 autopct를 plt.pid()속에 넣어주면 되겠습니다.

plt.figure(figsize=(10,10))
explode = [0.01, 0.01, 0.1, 0.1, 0.1]
plt.pie(x, labels=name, startangle=90, autopct='%.1f%%', counterclock=False, explode=explode)
plt.text(0.32,-1.0,n[1], c='b')  # 25억년 경계 눈금 표시
plt.text(-0.75,0.77,n[2], c='b')  # 5.2억년 경계 눈금 표시
plt.text(-0.45,1.05,n[3], c='b')   # 2.5억년 경계 눈금 표시
plt.text(-0.16,1.13,n[4], c='b')  # 0.66억년 경계 눈금 표시
plt.text(0.8,1.15,'(단위 : 억년)', c='k')
plt.title('지질시대 시간표', size=20)
plt.show()

앞선 그래프와 색상이 달라졌는데 colors=[]를 제거하여 기본 값으로 나온 화면입니다. 

 

마지막으로 부채꼴의 스타일을 바꿔보겠습니다.

wedgoprops를 이용하면 부채꼴의 모양을 바꿀 수 있습니다.

wedgeprops={'width': 0.9, 'edgecolor': 'w', 'linewidth': 3}
plt.figure(figsize=(10,10))
plt.pie(x, labels=name, startangle=90, autopct='%.1f%%', counterclock=False, wedgeprops=wedgeprops, colors=['orange','wheat','oldlace','darkgoldenrod','goldenrod'])
plt.text(0.32,-1.0,n[1], c='b')  # 25억년 경계 눈금 표시
plt.text(-0.75,0.77,n[2], c='b')  # 5.2억년 경계 눈금 표시
plt.text(-0.4,0.97,n[3], c='b')   # 2.5억년 경계 눈금 표시
plt.text(-0.15,1.02,n[4], c='b')  # 0.66억년 경계 눈금 표시
plt.text(0.8,1.15,'(단위 : 억년)', c='k')
plt.title('지질시대 시간표', size=20)
plt.show()

 

개인적으로 해보니까 지질시대별 경계를 굳이 표시하지 않는 것이 더 보기 좋을 것 같아서 

앞의 내용을 모두 적용하고, 지질시대별 경계만 제거해보겠습니다.

explode = [0.01, 0.01, 0.1, 0.1, 0.1]
wedgeprops={'width': 0.9, 'edgecolor': 'w', 'linewidth': 3}
plt.figure(figsize=(10,10))
plt.pie(x, labels=name, startangle=90, autopct='%.1f%%', counterclock=False, wedgeprops=wedgeprops, explode=explode, colors=['orange','wheat','oldlace','darkgoldenrod','goldenrod'])
plt.text(0.8,1.15,'(단위 : 억년)', c='k')
plt.title('지질시대 시간표', size=20)
plt.savefig('hh_detail6.png', bbox_inches='tight', pad_inches=0.1, dpi=300)
plt.show()

신생대의 위치가 아주 거슬리는데 어찌 수정해야 할 지 모르겠네요..;;

마지막에만 화질이 높은 사진을 넣어 괜히 좋아보이게 만든 것 같습니다.

아무튼 지질시대 파이차트 그리기는 여기서 마무리하겠습니다. 감사합니다.

반응형