파이썬

WRF-PYTHON 라이브러리로 WRF 결과물 시각화 (getvar, smooth2d)

이석사 중 2023. 9. 1. 11:38
728x90

이번 포스팅은 파이썬 라이브러리인 WRF-PYTHON을 사용해서

 

제가 만든 WRF 결과물을 시각화해보겠습니다


먼저 코드 입니다

  1 import pygrib
  2 import numpy as np
  3 import matplotlib.pyplot as plt
  4 from netCDF4 import Dataset
  5 from wrf import to_np, getvar, smooth2d, get_basemap, latlon_coords
  6
  7 from matplotlib.cm import get_cmap
  8
  9 from mpl_toolkits.basemap import Basemap
 10
 11 f = Dataset('./wrfout_d01_2016-10-06_03.nc')
 12
 13 t = getvar(f, "T2")
 14 slp = getvar(f, "slp")
 15
 16 t1 = t - 273.15
 17
 18
 19 smooth_slp = smooth2d(slp, 3, cenweight=4)
 20
 21 lats, lons = latlon_coords(t)
 22
 23 bm = get_basemap(t)
 24
 25 fig = plt.figure(figsize=(12,9))
 26
 27 bm.drawcoastlines(linewidth=0.25)
 28 bm.drawstates(linewidth=0.25)
 29 bm.drawcountries(linewidth=0.25)
 30
 31 x, y = bm(to_np(lons), to_np(lats))
 32
 33 ab = bm.contour(x, y, to_np(smooth_slp), levels = np.arange(960, 1041, 2), colors="black", linewidths = 0.4)
 34 plt.clabel(ab, inline=True, fontsize=10)
 35 bm.pcolormesh(x, y, to_np(t1), cmap=get_cmap("jet"))
 36
 37 plt.colorbar(shrink=.62)
 38
 39 plt.title("Temperature and Sea Level Pressure(hPa)", fontsize = 15)
 40
 41 plt.savefig('./temp-press')

코드 자체는 별로 길지 않습니다

 

하나씩 보겠습니다


WRF 파이썬의 코드를 짜고 보니까 NCL과 비슷한 점이 굉장히 많았습니다

 

그 부분이 제일 처음 설명드릴 부분입니다

 11 f = Dataset('./wrfout_d01_2016-10-06_03.nc')
 12
 13 t = getvar(f, "T2")
 14 slp = getvar(f, "slp")
 15
 16 t1 = t - 273.15
 17
 18
 19 smooth_slp = smooth2d(slp, 3, cenweight=4)
 20
 21 lats, lons = latlon_coords(t)

13번째, 14번째 줄을 보시면 getvar라는 모듈이 사용됐습니다

 

이는 NCL에서 WRF 결과물을 사용할때 쓰는 wrf_user_getvar라는 모듈과 기능이 똑같습니다

 

WRF 결과에 포함되어 있지 않는 SLP도 알아서 계산해주는 모듈도 똑같습니다

 

아무래도 NCL을 만든 NCAR에서 만든 라이브러리이다 보니까 코드를 이렇게 만든 것 같습니다

 

그래서 이해하기가 더 쉬었습니다

 

smooth2d는 공식 홈페이지를 보면 NCL 사이트에서는 찾을 수 없던 공식이 있습니다

s

기압의 경우 데이터가 격자 단위로 입력이 되어 있고 이를 그리면 

 

아래 2가지 차이가 발생합니다

왼쪽 그림은 smoothing을 하지 않은 그림이고 오른쪽은 smoothing을 한 그림입니다

 

얼핏 보면 차이가 없어보이지만 왼쪽 그림의 경우 등압선을 굉장히 날카롭고 복잡하게 그린 모습입니다

 

이는 관측 자료를 그대로 다 입력시켜 그리다보니 발생하는 문제입니다

 

예보관들에게 이런 데이터를 제공하면 분석이 오히려 어려워지기 때문에 반드시 해줘야합니다

 

그리고 마지막으로 latlon은 타겟 데이터의 위경도 자료를 가져온 것입니다


 23 bm = get_basemap(t)
 24
 25 fig = plt.figure(figsize=(12,9))
 26
 27 bm.drawcoastlines(linewidth=0.25)
 28 bm.drawstates(linewidth=0.25)
 29 bm.drawcountries(linewidth=0.25)
 30
 31 x, y = bm(to_np(lons), to_np(lats))
 32
 33 ab = bm.contour(x, y, to_np(smooth_slp), levels = np.arange(960, 1041, 2), colors="black", linewidths = 0.4)
 34 plt.clabel(ab, inline=True, fontsize=10)
 35 bm.pcolormesh(x, y, to_np(t1), cmap=get_cmap("jet"))
 36
 37 plt.colorbar(shrink=.62)
 38
 39 plt.title("Temperature and Sea Level Pressure(hPa)", fontsize = 15)

get_basemap은 공식 홈페이지에 설명으로는 

 

Return a matplotlib.mpl_toolkits.basemap.Basemap object for the map projection.

 

Returns A Projection subclass for the map projection.

 

이렇게 밖에 설명이 되어있지 않았습니다

 

추측해보면 WRF 결과 파일을 ncdump를 이용해서 확인해보면 global attribute에 

 

MAP_PROJ_CHAR = "Mercator"

이러한 속성이 지정되어 있습니다

 

이를 자동으로 반환해서 그릴 그림에 projection으로 사용하는 모듈인 것 같습니다

 

그 뒤로는 크게 새로운 코드들은 없고 basemap과 matplotlib를 사용해서 그림을 그리는 과정입니다


결과물입니다

NCL 그림과 비교해보면

꽤 비슷하게 그려진 모습입니다

 

앞으로는 NCL과 파이썬으로 2개씪 그려보려고 합니다

 

NCAR에서는 NCL의 지원을 종료하고 pivot-to-python이라는 NCL을 파이썬 라이브러리로

 

구현하려는 프로젝트를 진행중인 만큼 NCAR에서는 파이썬이라는 언어의 가치를 높게 평가하고 있는 것 같습니다

 

더 열심히 공부해서 현업에서 사용하는 그림들과 비슷하게 그릴 수 있도록 해보겠습니다

728x90