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

조석 예보표를 이용하여 날짜별 물때 변화 그래프 그리기

by 0대갈장군0 2021. 12. 27.
반응형

우리나라의 서해바다는 조석 간만의 차가 큰 지역으로 잘 알려져 있습니다.

 

국립해양조사원의 스마트 조석예보 홈페이지에서는 지역별로 예측한 조석예보를 제공하고 있으며, 누구든지 다운로드 할 수 있습니다.

 

아래 링크로 들어가면 되는데

 

스마트 조석예보

조석, 조석예보, 물때, 물때표, 물높이, 낚시, 해양활동, 바다갈라짐

www.khoa.go.kr

위와 같은 그림에서 원하는 지역을 클릭하고, 자료 다운로드를 클릭하면 

1시간 예측, 10분 예측, 1분 예측 중 원하는 것으로 엑셀 받기를 하면 됩니다.

저의 경우 1시간 단위를 다운로드 하였고, 그 다음 엑셀 파일을 열면 아래와 같은 파일이 열립니다.

여기서 데이터를 조금 가공해야 하는데, 맨 위에 한글로 써진 두 줄은 필요 없고, 시간 예측 조위라는 글자 또한 영어로 바꿉니다. 저의 경우 time, height로 바꾸었습니다. 

반응형

그 다음 파일 형식을 반드시 csv로 저장하셔야 합니다. 파이썬으로 읽기 위해서는 csv가 훨씬 유리합니다.

그리고 파이썬에서 불러오기 쉬운 폴더에 저장하는게 유리합니다. 저의 경우 C:드라이브에 111폴더를 생성하여, 여기에 파일을 저장했습니다.

 

이제 파이썬으로 데이터를 불러오겠습니다.

 

우선 csv 파일이기 때문에, 이를 불러올 때 유리한 pandas 라이브러리가 필요하고, 그래프를 그려야 하니 matplotlib.pyplot가 필요합니다. 각 라이브러리를 호출

 

import pandas as pd

import matplotlib.pyplot as pld

 

다음으로, csv 파일을 읽어올 차례입니다.

data라는 변수를 만들어주기 위해 아래와 같이 입력합니다.

 

data=pd.read_csv('C:\\111\\.tidal.csv')

 

여기서 폴더 경로와 파일은 자신이 지정해 준 폴더 경로와 파일대로 입력하시면 됩니다.

 

이제 그래프를 그리기 위한 코드 입력

 

plt.plot(data['time'],data['height'], color='green')

plt.show()

여기서 data['time']이라 함은, 데이터라는 변수에 있는 time이라는 헤더 데이터에 해당하는 변수를 x축 값에, height라는 헤더 데이터에 해당하는 변수를 y축 값에 입력하라는 의미를 가지며, 그래프의 색깔을 초록색으로 출력하라는 의미입니다.

 

결과를 보면

x축의 축 값이 이상하게 나왔습니다. 데이터 하나의 텍스트가 너무 길고 데이터의 수도 많아서 그렇습니다. 조금 솎아 내야합니다. 이 때 필요한 라이브러리는

 

import matplotlib.ticker as ticker

 

이며, 이를 활용하여 출력할 텍스트를 조금 솎아내야 합니다. 저의 경우 120개 간격으로 출력하도록 해 보았습니다. 아래 코드는 x축의 축 간격을 설정해 주는 코드입니다.

 

ax=plt.axes()
ax.xaxis.set_major_locator(ticker.MultipleLocator(120))

 

해당 코드를 집어넣고 출력을 하면 

이번에는 좀 알아 볼 수는 있는데 그래도 겹칩니다. 아직 긴 것 같습니다. 이제 x축의 데이터가 겹치지 않도록, 텍스트를 회전하겠습니다. 텍스트를 회전하는데 필요한 코드는

 

plt.xticks(rotation=45)

 

이며, 여기서 45가 회전 각도입니다. 코드를 실행하면

이제 좀 겹치지 않고, 알아볼 수 있습니다. 지금부터는 그래프가 좀 이뻐지게 꾸며 보겠습니다.

import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import pandas as pd
data=pd.read_csv('c:\\111\\tidal.csv')
plt.style.use('ggplot')             ## 그래프의 형식을 지정
plt.figure(figsize=(15,5))          ## 그래프의 크기 지정
ax=plt.axes()
ax.xaxis.set_major_locator(ticker.MultipleLocator(120))
plt.xticks(rotation=45)             
plt.xlabel('date',size=20)                ## x축 축제목 지정
plt.ylabel('height (cm)', size=20)        ## y축 축제목 지정
plt.plot(data['time'],data['height'], color='green')
plt.title('Anmyund island tidal',size=20)  ## 그래프 제목 지정
plt.savefig('C:\\111\\anmyuntidal.png', bbox_inches='tight', pad_inches=0.1, dpi=300)
plt.show()

 

그래프를 이쁘게 꾸미고, 그래프를 저장하는 코드까지 모두 합한 전체 코드입니다.

전체 코드를 모두 집어넣고 실행하면

 

조차가 작은 시기가 7월3일 경과 7월 18~19일 경이며, 조차가 큰 시기가 7월 13일과 7월 26일 경입니다. 조차가 작을 때는 달의 위상이 상현이나 하현, 조차가 클 때는 삭이나 망일 때입니다. 실제로 그런지 보겠습니다.

약간의 차는 있지만, 7월 2, 3일에 하현이고, 7월 17~18일 경에 상현입니다. 예측되는 조위와 거의 일치합니다.

 

조차가 클 때도 보면

조차가 큰 시기에 거의 삭에 가깝습니다.

마찬가지로 조차가 큰 26일 주변에는 보름입니다.

 

이와 같은 방법으로 같은시기 안면도와 강릉의 조차도 비교해 보았습니다.

강릉과 안면도를 비교해 보면 안면도의 조차가 강릉에 비해 압도적으로 커서 강릉 조차는 거의 보이지 않습니다. y축의 범위가 같아서 보이지 않은 겁니다. 강릉의 y축 범위를 조절해야겠습니다.

이 때는 plt. ylim(최저값, 최대값)으로 지정해 주면 됩니다.

따로 지정해 주지 않으면 기본 값으로 출력해 줍니다. 위 그래프는 안면도와 비교하기 위해 제가 인위적으로 y축 범위를 지정해 준 경우 입니다.

지정해 주니 잘 보이기는 하는데, 강릉과 안면에서 날짜에 따라 조차가 가장 큰 시기와 가장 작은 시기에 다소 차이가 있습니다. 위도, 경도 차에 의한 조석 에너지의 도착 시간 차이(켈빈파), 물의 양에의한 조석 에너지의 반응 속도 등에 영향이 있는 것 같지만 정확한 것은 전문가의 자문을 받아봐야 할 것 같습니다.(전 이 분야 전문가가 아니라...ㅠㅠ)

 

어쨌든, 안면과 강릉의 그래프를 모두 그리는 전체 코드를 아래에 두겠으니 활용하시기 바랍니다.

아래 코드는 판다스를 사용하지 않고 csv와 for 문을 사용하여 구동하였습니다.

 

import csv
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
data=open('c:\\111\\tidal.csv')
data2=csv.reader(data)
data3=open('c:\\111\\tidalgang.csv')
data4=csv.reader(data3)
next(data2)
next(data4)
ttime=[]
height=[]
ttime2=[]
height2=[]

for row in data2:
    t=row[0]#.split(' ')[0]
    ttime.append(t)
    height.append(float(row[1]))
    
for row2 in data4:
    f=row2[0]
    ttime2.append(f)
    height2.append(float(row2[1]))

fig=plt.figure(figsize=(10,5))

ax1=fig.add_subplot(211)
ax1.xaxis.set_major_locator(ticker.MultipleLocator(96+24))
ax1.plot(ttime,height, color='green', label='An myeon')
plt.xticks(rotation=45)
plt.legend()
plt.xticks(color='w')
plt.ylabel('height(cm)', size=13)
plt.grid(True)
plt.subplots_adjust(wspace=0, hspace=0)
plt.title('An myeon and Gang neung tidal', size=15)

ax2=fig.add_subplot(212)
ax2.plot(ttime2,height2, color='red', label='Gang neung')
ax2.xaxis.set_major_locator(ticker.MultipleLocator(96+24))
#ax1.xaxis.set_visible(False)
plt.ylabel('height(cm)', size=13)
plt.xlabel('date', size=15)
plt.grid(True)
plt.xticks(rotation=45)
plt.legend(loc=2)
plt.ylim(0,700)
plt.savefig('C:\\111\\tidal2.png', 
           bbox_inches='tight', pad_inches=0.1, dpi=300)
plt.show()
반응형

댓글