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

파이썬을 이용하여 동해바다의 계절별 연직 수온분포 그래프 그리기

by 0대갈장군0 2022. 2. 21.
반응형

지난 포스팅에서 동해바다의 연직방향 수온 분포 그래프를 그렸습니다. 해당 데이터는 4월 16일 데이터로, 봄에 해당하는 데이터인데, 이번에는 봄, 여름, 가을, 겨울 데이터를 모두 사용하여 그래프 4개를 그려 볼 예정입니다. 4개의 그래프를 for문을 이용해 그릴건데, 단순하게 코드를 여러번 반복하며 그래프를 그리면 생각할게 별로 없이 간단하게 할 수 있겠지만, 이러면 코드에 똑같은 내용이 자꾸 반복되어 좋지 않습니다.

우선 데이터를 다운받아야 하는데, 지난번처럼 국립기상과학원 ARGO에서 원하는 데이터를 다운로드 하면 됩니다. 봄, 여름, 가을, 겨울에 해당하는 월의 데이터를 다운받고, 지난번 포스팅을 참고하여 텍스트를 일부 수정하고, csv로 바꾸어 주면 됩니다.(아래 링크 참고)

 

파이썬을 이용하여 해수의 깊이에 따른 수온 변화 그래프 그리기

중학교 과학이나 고등학교 지구과학 1 의 해양단원에서 학생들이 수도 없이 많이 보는 그래프가 있습니다. 깊이에 따른 수온변화 그래프인데, 교과서에는 아래와 같은 그림으로 소개됩니다. 데

kalchi09.tistory.com

텍스를 수정하거나 csv로 변환하는것 역시 파일이 4개나 있으니 파이썬에서 코드를 짜면 같은 일을 여러번 하지 않고도 한꺼번에 바꿀 수 있지만, 이것까지 해 버리면 내용이 너무 어려울 것 같아, 이건 다음번 포스팅으로 잠시 미루겠습니다.

어쨌든 여기에 사용한 데이터 종류를 적어두니, 필요하신 분은 그대로 따라가셔서 다운로드하셔도 되고, 제가 파일을 여기에 올려두겠으니, 올린 파일을 사용하셔도 됩니다. 국립 기상과학원 ARGO 데이터 다운도 위 링크를 참고하시면 됩니다.

WMO ID Profile Number 관측날짜 위도 경도
2901244 096 2014-05-21 36.302 130.460
2901244 103 2014-07-09 36.250 130.385
2901244 105 2014-10-22 37.736 130.332
2901244 129 2015-01-21 37.544 130.366

20140521.txt
0.00MB
20140709.txt
0.00MB
20141022.txt
0.00MB
20150121.txt
0.00MB

미리 말씀드리는 점은 계절별 깊이에 따른 수온 변화를 더 정확히 알기 위해서는 한 고정 지점에서 관측한 해당 계절의 데이터를 모두 평균한 것을 쓰는 것이 더 정확할 수 있으나 ARGO는 자꾸 뿔뿔뿔 돌아다니면서 측정하는만큼 고정 데이터를 얻기 어렵고, 여러 날의 데이터를 모두 다운로드하고 깊이에 따라 평균하기에는 제가 너무 귀찮아서(^^;;;;;) 이렇게 어느 특정 일만 사용하는 점 참고 바라며, 계절별 특성 정도를 보는 수준에서 참고하시기 바랍니다.

 

어쨌든 해당 텍스트 파일을 모두 csv로 바꾸고, 파일 이름도 20140521은 1.csv , 20140709는 2.csv, 20141022는 3.csv, 20150121은 4.csv로 바꾸어 줍니다. 이렇게 하는 이유는 나중에 야들을 for문을 사용하여 한꺼번에 그래프로 그리기 위함입니다.

반응형

  1. 필요한 라이브러리 호출과 한글 입력

지난번에도 이야기 한 것 처럼 파이썬은 한글을 못알아 들으니 한글이 되도록 코드를 입력하고, 그래프 그리기와 csv파일을 읽는데 필요한 라이브러리를 호출합니다.

  2. 반복문 구현 준비와 그래프 크기 지정

1.csv~4.csv까지 순서대로 파일을 읽기 위해 미리 range 문구로 숫자를 지정해 주고, 그래프를 그릴 크기를 지정해 줍니다.

여기서 사용한 rage(1,5)는 1에서 5미만까지의 자연수를 1간격으로 출력하라는 코드입니다. 예를들어 range(1,10)이라고 쓰면 1에서 9까지를 1간격으로 호출하라는 뜻이고, range(1,11,5)면 1에서 10까지를 5간격으로 호출하라는 소리입니다.

  3. 반복문을 이용하여 파일을 순차적으로 읽기

for 문을 사용하여 range의 1에서 4 까지를 순차적으로 읽어내려가도록 했습니다. 여기서 no2=str(no), no3=str(no)라고 하여 두 가지 변수를 str이라는 것으로 정의하였는데, str은 숫자를 문자로 인식하라는 명령어입니다. range에서 호출한 것은 숫자이기 때문에, 아래 파일 이름에 직접 대응할 수 없어 문자로 바꾸어 주어야 인식할 수 있습니다. 그래서 str을 사용하여 숫자를 문자로 인식하도록 해 준 것입니다.
그리고 no3 다음에 파일 주소를 집어 넣었고, 중간에 no2를 집어 넣어, 해당 파일 이름이 순차적으로 바뀌어 나가도록 하였습니다. 이렇게 함으로써 1.csv에서 4.csv까지 모두 그래프를 하나씩 그려나갈 수 있습니다.

그리고 x값과 y갑을 지정해 주었습니다.

  4. 압력을 수심으로 바꾸어 주기

그런데 y축 값은 기본적으로 데이터가 압력으로 제시되어있습니다. 지난 포스팅에서도 언급한 것 처럼 이를 모두 깊이로 바꾸어 줍시다.(압력으로 그냥 써도 되기는 합니다. 심지어 압력 단위가 dbar로 관측되어 깊이(m)로 바꾸어도 숫자가 거의 차이가 없습니다.)

이렇게 바꾸어 줌으로써 y축 값으로 no3['P']를 사용하는것이 아니라, depth가 사용되게 되었습니다.

 

 

  5. 범례 정해주기와 그래프 그리기

이제 그래프를 그릴 차례입니다. 그래프가 4개이기 때문에, 범례를 지정해 줘야 하는데, 처음에 1.csv~4.csv로 파일 이름을 바꾸어 주었습니다. 여기서 1은 봄(5/21), 2는 여름(7/9), 3은 가을(10/22), 4는 겨울(1/21)에 관측한 그래프이기 때문에, 여기에 맞게 범례를 잡아 주는데, 반복문을 사용하여 그래프를 구현해주고 있기 때문에, if를 사용해 아래와 같이 코드를 구현해 보았습니다.


이렇게 하면, 1.csv 일때는 5/21, 2.csv일때는 7/9, 3.csv 일때는 10/22, 4.csv 일때는 1/21로 범례의 이름이 들어가게 됩니다. 범례 이름을 봄 여름 가을 겨울로 하지 않은 이유는, 아까도 이야기 한 것 처럼, 계절로 할 꺼면 계절에 해당하는 날짜를 모두 평균해야 하는데 평균데이터가 아니라 특정 일의 데이터만 취했기 때문에 저리 하였습니다.

중요한 코드는 다 끝났습니다. 이제부터는 단순히 그래프를 이쁘게 꾸미는 과정입니다. 지난 포스팅과 내용이 중복되구요.
하나씩 다시 설명을 하자면.

1) plt.gca().invert_yaxis()
y축 반전
2) plt.gca().xaxis.set_ticks_position('top')
x축 틱을 상단으로
3) plt.gca().xaxis.set_label_position('top')
x축 제목을 상단으로
4) plt.tick_params(axis='x', direction='in')
x축 틱을 그래프 안으로
5) plt.tick_params(axis='y', direction='in')
y축 틱을 그래프 안으로
6) plt.legend()
범례를 그리기(범례 위치를 바꾸고 싶으시면 ()안에 loc=1~4 사이 숫자를 넣으시면 됩니다.)
7) plt.xlim(0,30)
x축 최소, 최대값
8) plt.ylim(700,0)
y축 최대 최소값
9) plt.grid(linestyle='-.')
그래프 보조선 그리기
10) plt.xlabel('수온(℃)')
x축 제목
11) plt.ylabel('깊이(m)')
y축 제목

이렇게 완성된 그래프입니다.

위 그래프에 대한 해석은 해수의 깊이별 수온 분포 그래프 해석을 다룬 아래 링크를 확인하세요

** 함께보면 좋습니다

 

해수의 연직방향(깊이에 따른) 수온변화

** 함께 보시면 좋습니다. 파이썬을 이용하여 해수의 깊이에 따른 수온 변화 그래프 그리기 중학교 과학이나 고등학교 지구과학 1 의 해양단원에서 학생들이 수도 없이 많이 보는 그래프가 있습

kalchi09.tistory.com

** 함께보면 좋습니다

 

파이썬을 이용하여 해수의 깊이에 따른 수온 변화 그래프 그리기

** 함께보면 좋습니다 해수의 연직방향(깊이에 따른) 수온변화 ** 함께 보시면 좋습니다. 파이썬을 이용하여 해수의 깊이에 따른 수온 변화 그래프 그리기 중학교 과학이나 고등학교 지구과학 1

kalchi09.tistory.com

위에 설명한 코드가 정답은 아니며, 이보다 더 간단한 코드가 당연히 있습니다. 최대한 이해하기 쉽게 하다보니 다소 코드가 길어졌습니다. 어쨌든 전체 코드를 필요하신 분들을 위해 두니 복사하여 사용하시면 됩니다.

 

import matplotlib.pyplot as plt
import pandas as pd
from matplotlib import font_manager, rc ## 한글
rc('font', family='HCR Dotum') ## 한글
value=range(1,5)
plt.figure(figsize=(6,6)) # 그래프 크기 지정
for no in value:
no2=str(no)
no3=str(no)
no3=pd.read_csv('C:\\111\\ARGO\\nicedata\\'+no2+'.csv')
x=no3['T']
y=no3['P']
depth=[]
for z in y:
	a=z*10**4/1.027*1000/1000000/9.8
	depth.append(a)
	if no2=='1':
		name='5/21'
		plt.plot(x,depth, label=name)
	elif no2=='2':
		name='7/9'
		plt.plot(x,depth, label=name)
	elif no2=='3':
		name='10/22'
		plt.plot(x,depth, label=name)
	else:
		name='1/21'
		plt.plot(x,depth, label=name)
plt.gca().invert_yaxis()
plt.gca().xaxis.set_ticks_position('top') ## x축 틱과 틱값 상단으로
plt.gca().xaxis.set_label_position('top') ## x축 제목 상단으로
plt.tick_params(axis='x', direction='in') ## x축 틱 안으로
plt.tick_params(axis='y', direction='in') ## y축 틱 안으로
plt.legend()
plt.xlim(0,30)
plt.ylim(700,0)
plt.grid(linestyle='-.') ## 그래프에 보조선
plt.xlabel('수온(℃)') ## x축 제목 지정
plt.ylabel('깊이(m)') ## y축 제목 지정

plt.title('동해의 계절별 깊이에 따른 수온 분포') ## 그래프 제목
plt.savefig('C:\\111\\ARGO\\nice_final2.png',dpi=300)
plt.show()
반응형

댓글