이번 포스팅은 파이썬 라이브러리인 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 사이트에서는 찾을 수 없던 공식이 있습니다
기압의 경우 데이터가 격자 단위로 입력이 되어 있고 이를 그리면
아래 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에서는 파이썬이라는 언어의 가치를 높게 평가하고 있는 것 같습니다
더 열심히 공부해서 현업에서 사용하는 그림들과 비슷하게 그릴 수 있도록 해보겠습니다
'파이썬' 카테고리의 다른 글
건조공기의 이상기체 방정식 그래프 그리기(대기 열역학) (0) | 2023.09.25 |
---|---|
Monin-Obukhov Similarity Theory Curve 파이썬으로 그려보기 (0) | 2023.09.19 |
작업29: NCL로 시각화한 자료 파이썬으로 gif 만들기2 (0) | 2023.06.25 |
작업28: NCL로 시각화한 자료 파이썬으로 gif 만들기1 (0) | 2023.05.04 |
작업27: 파이썬으로 대기 상단 연평균 일사량 계산하고 시각화하기2 (0) | 2023.04.30 |