본문 바로가기
파이썬으로 배우는 지구과학

파이썬의 pie chart로 지질시대 시간표 만들기

by 0대갈장군0 2021. 7. 2.
반응형

지질시대 시간표 만들기는 비상교과서 지구과학1과 금성교과서 통합과학에 실려 있습니다.

 

학생들은 지질시대 시간표 만들기를 할 때에 정확한 시간 스케쥴을 나타내기 위해 비례식을 새우고 그 결과를 그림으로 직접 그려야 하는데, 간단한(?) 파이썬 코드를 짜면 꾀 정확한 시간표를 만들 수 있습니다.

 

여기서는 matplotlib라는 라이브러리에서 제공하는 pie chart를 이용해서 지질시대 시간표를 만들어 보겠습니다.

 

pie chart는 아래 그림과 같이 어떤 값이 전체에서 차지하는 비율을 나타내는데 많이들 활용합니다.

<pie chart의 예시(출처 : Algorex)>

python에서 초등학생들 1일 생활계획표 같은 것을 짜는 라이브러리가 있을것 같지는 않아서(있나?) pie chart를 이용하기로 하였습니다.

 

  1. 필수 라이브러리 불러오기

필수 라이브러리는 matplotlib.pyplot입니다, 차트에 한글을 쓰고 싶으면 두 번째 줄과 세 번째 줄의 코드도 함께 이용합니다.

*****맨 아래에 복붙 하시고 싶은 분들을 위해 풀 코드를 적어 두겠습니다. 조금만 기다리세요*****

 

 

  2. 리스트형 자료 생성하기

지질시대 연령이 필요한데, 이를 리스트형 자료로 생성하겠습니다.

지구가 만들어진 시기를 40억년 전, 시생누대와 원생누대의 경계를 25억년 전, 고생대 시작이 5.2억년전, 중생대 시작이 2.5억년 전, 신생대 시작이 0.65년전이므로 아래와 같은 리스트형 자료를 만들고자 합니다.

 

n=[40, 25, 5.2, 2.5, 0.65]

 

각 지질시대에 해당하는 라벨을 붙여야 하기 때문에, 지질시대 이름을 붙이기 위한 리스트형 자료도 생성합니다.

 

name=['시생누대', '원생누대', '고생대', '중생대', '신생대']

 

여기서 연령은 잠시 뒤에 계산을 해야하고, 그래프로 나타내려면 비율로 따져야 하기 때문에 n 이라고 지정한 리스트형 자료는 숫자로 지정하기 위해 ' ' 를 사용하지 않았습니다. 하지만 name이라고 지정한 리스트형 자료는 문자여야 하기 때문에 ' ' 를 사용하였습니다.

 

이제 연령을 계산한다음 저장해 둘 빈 리스트형 자료를 생성할겁니다.

 

result=[ ]

 

총 3가지의 리스트형 자료가 만들어졌습니다. 여기까지의 코드는

  3. 각 지질시대별 소요시간 계산하기

여기서 부터 복잡해집니다. 주목!!

 

pie chart에 표현하기 위해서는, 각 지질시대의 시작시간이 필요한게 아니라 전체 40억년 중의 비율이 필요합니다. 그러니까 시생누대가 지속된 시간, 원생누대가 지속된 시간 등이 필요한겁니다.

 

시생누대는 40억년 전~25억년 전까지이기 때문에, 40-25=15억년이 되고

원생누대는 25억년 전~5.2억년 전까지이므로, 25-5.2=19.8억년이며,

고생대는 5.2-2.5=2.7

중생대는 2.5-0.66=1.85

신생대는 0.66-0(현재)=0.66년입니다.

 

이를 계산기로 두들겨서 계산한 뒤 리스트를 만들어도 되지만!!! 파이썬 내에서 알아서 구현되게 하는게 의미가 있습니다. 그래야 코딩 연습도 되고. 엄청 어렵지는 않으니 잘 따라와 보시면 됩니다.

 

여기서 for 문을 사용할 겁니다. 저 리스트에 있는 수들을 차례로 빼기만 하면 되니까요.

 

따라서

t=0 이라는 수를 하나 선언하고

for a in n: 이라고 시작!

t+=1 -> t=0인데, 여기에 1을 더한 것을 t라고 한다. 즉, for 문의 루프가 1회 돌아갈 때 마다 t+1을 하고 이를 새롭게 t로 지정해주는 겁니다!! 여기까지의 코드는

t=0

for a in n:

    t+=1

입니다. 그리고 여기서 if문을 쓸겁니다. 왜 쓰는지는 아래 코드를 보시면 이해가 될 겁니다.

 

위의 코드를 해석하면,

처음 t는 0이었고, 첫번째 리스트인 40을 불러왔을 때, t에도 같이 1을 더해서 t=1이 됩니다.

여기서 if 문을 사용했는데, 만약 t가 5보다 작으면, 첫번째 n(a)인 45-n[t]를 해라, 현재 t는 1이므로, 40-n[1]이 됩니다. n[1]은 n이라는 리스트 자료의 두 번째 데이터인 25이므로, s=40-25=15가 됩니다.

그 아래코드는 두번째 조건문인 elif입니다. 두번째 조건은 t가 계속 더해서 5가 되면 그때는 n[t]를 빼지 말고 0을 빼라는 소리입니다.

 

이걸 쭉 해석을 하면,

첫번째 리스트 40을 불러올 때, t=1이므로 t가 5보다 작으니, s=40-n[1] 즉, s=40-25를 하고, result.append(s) 그 결과값인 s=15를 result라는 리스트에 추가하라는 소리입니다.

for는 반복하라는 뜻이니까, n의 두 번째 리스트인 25를 불러올 것이고, 이 때 t도 한번 반복하여 이번에는 t=2가 됩니다. 여전히 5보다 작으므로 s=25-n[2] 즉, s=25-5.2가 되고, 이 값을 또 result라는 리스트에 추가합니다.

이번에는 n의 세번째 리스트 5.2, 이때 t는 3이 되고, 여전히 5보다 작습니다. 위의 두 가지 과정을 반복합니다.

 

중간과정은 생략하고, 마지막 리스트인 0.66을 불러오면 이때 t는 5가 됩니다. t는 이제 더이상 5보다 작지 않고 5와 같은 값입니다. 이때는 s=a-0, 즉 0.66-0을 취하고, 이 값을 result라는 리스트에 추가하라는 뜻입니다.

 

n이라는 리스트를 반복하여 작업을 마친 결과 result라는 리스트에는 [15, 19.8, 2.7, 1.85, 0.65]이 추가되었습니다.

 

여기까지 잘 이해하셨다면 80퍼센트는 끝났습니다.

반응형

  4. pie chart 그리기

이제 데이터는 모두 만들었으니 그래프를 그릴 차례입니다.

첫 번째 코드 plt.figure(figsize=(10,10))은 그래프의 크기를 정하는 코드입니다. 신생대의 경우 너무 작아 글씨가 겹쳐지기 때문에 그래프를 조금 크게 했습니다.

두 번째 코드는 pie chart를 불러오는 코드입니다.

plt.pie(에 첫 번째 값은 pie chart에 들어갈 비율입니다. result라는 리스트에 그 값이 있으니 result라고 써 줍니다.

plt. pie(에 두 번째 값은 labels로, 각 비율에 해당하는 말 그대로 labels입니다. labels는 모두 name이라는 리스트에 지정되어 있으므로, labels=name이라고 지정합니다.

startangle=90은 piechart의 회전 시작지점을 지정해주는 겁니다. 숫자를 180, 270, 60 등으로 바꾸어 보면 쉽게 이해가 될 겁니다.

counterclock는 각 값을 시계방향 순서로 할지 반시계방향으로 할지 정하는 겁니다. False로 하면 시계방향, True로 하면 반시계방향입니다.

 

plt.title은 그래프의 제목, size는 글자의 크기

plt.text는 그래프에 글자를 집어 넣는것인데,

plt.text(0.9,1.1,'(단위 : 억년)', size=14)를 예로들어 설명하면, 0.9 , 11은 글자가 들어갈 x, y의 좌표, '(단위 : 억년)'은 넣고싶은 글자, size=14는 글자의 크기입니다. color를 기본적으로 지정해주지 않으면 그냥 검정색으로 표시되는데, 따로 글자색을 표기하고싶으면 c='b' c='r', c='c' 등으로 하면 됩니다. 글자 색과 관련된 코드는 검색하면 나와요.ㅎㅎ

 

plt.savefig는 그래프를 저장하고 싶은 파일이름과 폴더입니다. dpi=300은 해상도는 아니지만, 그래프 품질쯤으로 생각하면 됩니다. 300이상은 아무 의미없습니다. 괜히 파일 용량만 커질뿐...

 

여기까지 모든 코드를 복붙할 수 있게...

import matplotlib.pyplot as plt
from matplotlib import font_manager, rc ## 한글 불러오기
rc('font', family='HCR Dotum') ## 한글 불러오기

n=[40,25,5.2,2.5,0.65]
name=['시생누대','원생누대','고생대','중생대','신생대']
result=[]
t=0
for a in n:
    t+=1
    if t<5:
        s=a-n[t]
    elif t==5:
        s=a-0
    result.append(s)
print(result)
plt.figure(figsize=(10,10))
plt.pie(result, labels=name, startangle=90, counterclock=False)
plt.title('지질시대 시간표', size=20)
plt.text(0.9,1.1,'(단위 : 억년)', size=14)
plt.text(0.72,-0.75,n[1], c='b', size=12)
plt.text(-0.81,0.71,n[2], c='b', size=12)
plt.text(-0.44,0.96,n[3], c='b', size=12)
plt.text(-0.14,1.02,n[4], c='b', size=12)
plt.savefig('C:\\fff\\timetable.png', dpi=300)
plt.show()

  5. 실행 결과

그래프의 색을 바꿀수도 있습니다. 그래프의 색을 바꾸려면

 

plt.pie(result, labels=name, startangle=90, counterclock=False)

 

라는 코드의 맨 마지막에 colors=['yellow], 'blue'......]의 형태로 리스트형 자료를 생성하면됩니다. 총 자료의 수는 5개이므로, 5개의 색상을 지정해줘야 합니다.

 

예를들어

 

plt.pie(result, labels=name, startangle=90, counterclock=False, colors=['olive', 'yellow', 'olivedrab', 'yellowgreen', 'darkolivegreen'])

 

이렇게 코드를 추가하면

그래프의 색상별 코드는 아래 그림을 참조하세요

 

여기까지 오랜만의 포스팅으로 돌아와 파이썬에 대한 이야기를 하였습니다.

 

다음에도 재미있는 파이썬 코드로 지구과학 이야기를 풀어가 보겠습니다.

 

 

반응형

댓글