파이썬/matplotlib

작업 1 : ASOS 자료를 이용한 간단한 plot

이석사 중 2022. 3. 22. 00:35
728x90

조금 더 클린 코드면 좋을 듯 싶지만

일단은 코드 구현의 집중을 했습니다

 

제가 해본것은 강릉과 울진에 산불이 난 시점에 풍향과 풍속을 알아보고 싶었습니다

저도 현재 강릉에 있으면서 강릉에 산불이 났던 3월 5일 12시 경에 풍속이 어마어마 했었습니다

 

이번 산불의 주된 확산 원인도 강풍과 3년정도 매우 적었던 강수탓에 건조했던 산지라고 합니다

그래서 풍속이 얼마나 강했고 풍향은 어느 방향이었는지를 알아보겠습니다

 

저는 강릉과 동해, 울진 이렇게 3곳의 3월 2일부터 3월 13일까지의 자료를 이용했습니다

자료를 설정 이유는 먼저 울진만 알아보려 했으나 강릉도 함께 알아보기 위함이고

울진 산불의 경우 3월 2일 오전 11시경부터 발화가 시작되었고 산림청의 보도에 따르면

3월 13일 오전 9시 주불은 잡았다고 했기 때문에 자료의 범위를 저렇게 설정하게 되었습니다

 

서울자료와 기상자료개방포털에서 제공하는 기후값 데이터도 함께 이용했습니다

기후값은 과거 30년 자료의 평균값을 말하며 평년값이라고도 합니다

현재 제공하는 기후값은 1991년부터 2020년까지의 평균값을 이용합니다

 

이 기후값은 딱 떨어지는 년도에 다시 산출을 합니다

예를 들어 2031년부터는 2000년부터 2030년까지의 자료를 이용합니다

 

서울자료를 이용한 이유는 강릉과 울진은 영동 지방이기 때문에 영서 지방에 자료와도

비교를 해보고 싶었습니다

훨씬 영서 지방인 강화도 자료를 이용하려고 했으나 서울이 조금 더 비교하기 좋을 것 같다고 생각했습니다

 

ASOS는 종관기상관측을 말합니다

전국의 96개 지점에서 관측을 하며 기상청 관리자가 직접 기온, 습도, 강수량 등 14개의

기상요소를 관측합니다

 

중간중간 주석으로 구분을 나누긴 하였지만 이해가 안되시거나 조금 더 

클린코드로 작성이 가능하다고 생각을 가지신 분들도 있으실 거라고 생각합니다

저도 아직 배우는 단계이기 때문에 댓글에 서스름없는 피드백 부탁드립니다

 

이 코드를 이용해보실 분들은 자료의 경로는 꼭 바꿔서 이용하시길 바랍니다

 

#Library Import
import folium
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from math import radians, pi
from windrose import WindroseAxes
import matplotlib.cm as cm
import webbrowser
import base64 as bs4
import matplotlib as mpl


#Data preprocessing
def ASOS(stn_nm):
    data = pd.read_csv('/content/drive/MyDrive/{}_ASOS.csv'.format(stn_nm), encoding = 'euc-kr')
    df = pd.DataFrame(data)
    df = df.rename(columns = {'지점' : 'stn', '지점명' : 'nm', '일시' : 'date', '풍향(16방위)' : 'wd', '풍속(m/s)' : 'ws'})
    df1 = pd.DataFrame({'nm' : df['nm'], 'date' : df['date'], 'ws' : df['ws'], 'wd' : df['wd']}).reset_index(drop = True)
    df1.index = df.stn.values
    return df1



def CV(stn_nm1):
    data1 = pd.read_csv('/content/drive/MyDrive/{}_기후값.csv'.format(stn_nm1), encoding = 'utf-8')
    df2 = pd.DataFrame(data1)
    df2 = df2.rename(columns = {'지점' : 'stn', '지점명' : 'nm', '일시' : 'date', '풍속(m/s)' : 'ws'})
    df3 = pd.DataFrame({'nm' : df2['nm'], 'date' : df2['date'], 'ws' : df2['ws']}).reset_index(drop = True)
    df3.index = df2.stn.values
    return df3


#Variable 
gangneung = ASOS('강릉')
donghae = ASOS('동해')
uljin = ASOS('울진')
seoul = ASOS('서울')


gn_cv = CV('강릉')
dh_cv = CV('동해')            
uj_cv = CV('울진')


gn_ws = gangneung['ws']
dh_ws = donghae['ws']
uj_ws = uljin['ws']


gn_wd = gangneung['wd']
#gn_wd = [radians(a) for a in gn_wd]
dh_wd = donghae['wd']
#dh_wd = [radians(a) for a in dh_wd]
uj_wd = uljin['wd']
일단 이 부분까지는 파일일 불러오는 과정과 변수를 만들고 선언하는 부분입니다
간단한 부분입니다
ASOS 자료는 엑셀과 CSV 형태로 제공을 합니다
 
#Plot defination
def plotter(ax, nm, unm, cv):
  tm = range(len(seoul['date']))
  ax.plot(tm, nm, lw = 1.5, c = 'red', label = '{}'.format(unm))
  ax.plot(tm, seoul['ws'], lw = 1.5, c = 'hotpink', label = 'seoul', ls = '--')
  ax.plot(tm, cv, lw = 2, c = 'k', ls = '-.', label = '{} Climate Value'.format(unm))
  ax.set_xlabel('Date', fontsize = 15)
  ax.set_ylabel('Wind Speed', fontsize = 15)
  plt.xticks(np.arange(0, 287, 24), labels = ['3/2', '3/3', '3/4', '3/5', '3/6', '3/7', '3/8', '3/9', '3/10', '3/11', '3/12', '3/13'])
  ax.tick_params(length = 10, width = 1.5, labelsize = 13, direction = 'in')
  ax.set_title('3/3 ~ 3/15 {} WindSpeed'.format(unm), fontsize = 20)
  ax.legend(fontsize = 10, loc ='best')
  ax.grid()
  plt.show()
 
그림을 그리기 위한 함수를 선언하는 부분입니다
함수를 하지 않고 하나하나 그려도 가능하지만 linewidth, linecolor, marker 등
parameter들이 많아지면 코드는 점점 길어지고 지저분해 보입니다
이렇게 길어질 것 같은 부분은 함수를 이용하는 것이 보기 편합니다
 
#Plot
fig, ax = plt.subplots(figsize = (10, 7))
plotter(ax, gangneung['ws'], 'Gangneung', gn_cv['ws'])


ax = WindroseAxes.from_ax()
ax.contourf(gn_wd, gn_ws, bins = np.arange(0, 8, 1), cmap = cm.hot)
mpl.projections.polar.PolarAxes.set_theta_zero_location(ax, loc="N", offset=0.0) 
mpl.projections.polar.PolarAxes.set_theta_direction(ax, direction=-1) 
mpl.projections.polar.PolarAxes.set_thetagrids(ax, angles=[0, 45,90,135,180,225,270,315,], labels=["N","NE","E","SE","S","SW","W","NW"], fmt='str')
ax.set_title('Gangneung Wind Direction', fontsize = 15)

ax.set_legend()

이번에는 풍속뿐만 아니라 풍향 데이터도 함께 있습니다

풍향데이터는 각도로 제공을 하기 때문에 windrose라는 바람 장미도를 그리는 라이브러리를 이용했습니다

 

이렇게 코드를 이용해서 그린 결과물입니다

마지막에 그리는 부분에서 parameter를 동해와 울진으로 바꾸면 다른 그림이 나오기 때문에

그려보실 분들은 꼭 강릉만이 아니라 동해, 울진도 그려보시면 좋을 것 같습니다

 

아직은 실제 자료를 이용해서 그림을 그리는 것에 익숙해지는 중이기 때문에

의미있는 가치물은 산출하지 못했다고 생각합니다

 

추후에 다른 라이브러리들도 함께 이용해서 가치있는 것들을 만들도로 해보겠습니다

이 자료는 해당 포스팅으로 끝나지 않습니다 

다음 포스팅에서는 지도를 이용하는 folium이라는 라이브러리를 이용해보겠습니다

728x90

'파이썬 > matplotlib' 카테고리의 다른 글

파이썬 basemap으로 일기도 비슷하게 그려보기  (0) 2023.07.26