[R] "rsoi" 패키지를 통해 엘니뇨-남방진동 (EI Nino-Southern Oscillation) 자료 다운로드 및 가시화

 정보

  • 업무명     : "rsoi" 패키지를 통해 엘니뇨-남방진동 (El Nino-Southern Oscillation) 자료 다운로드 및 가시화

  • 작성자     : 이상호

  • 작성일     : 2020-03-08

  • 설   명      :

  • 수정이력 :

 

 내용

[개요]

  • 안녕하세요? 기상 연구 및 웹 개발을 담당하고 있는 해솔입니다.

  • El Nino-Southern Oscillation (ENSO)은 지구 대기 순환을 변화시키는 능력으로 인해 지구상에서 가장 중요한 기후 현상 중 하나이며 이는 전 세계 온도와 강수량에 영향을 끼칩니다.

  • 이러한 ENSO는 중부 및 동부 열대 태평양의 수온 변화와 관련된 반복되는 기후 패턴입니다. 약 3 년에서 7 년 사이의 기간 동안 해수면 온도는 일반 태평양에 비해 1-3 °C까지 따뜻하거나 차가워집니다.

  • 이는 ENSO 진동으로서 온난화 또는 냉각화는 열대 지방의 강우 분포에 직접적인 영향뿐만 아니라 미국 및 기타 지역의 날씨에도 큰 영향을 줄 수 있습니다. 엘니뇨 (El Nino) 와 라니냐 (La Nina)는 ENSO 진동의 극단적인 단계입니다. 이 두 단계 사이에는 ENSO 중립이라는 세 번째 단계도 있습니다.

    • 엘니뇨 (El Nino)

      • 중부 및 동부 열대 태평양에서 해수면 또는 평균 해수면 온도 (SST)의 온난화의 경우 인도네시아에서는 강우량이 감소하는 반면 중부 및 동부 열대 태평양에서는 강우량이 증가합니다.

      • 일반적으로 적도를 따라 동쪽에서 서쪽으로 불어오는 지표면 바람 (동풍)은 약화되거나 다른 방향 (서쪽에서 동쪽 또는 서풍)으로 불기 시작합니다. 일반적으로 해수면 온도가 평상시보다 따뜻할수록 El Nino가 강해집니다 (그 반대도 마찬가지).

    • 라니냐 (La Nina)

      • 중부 및 동부 열대 태평양에서 해수면 또는 평균 해수면 온도 (SST)의 냉각화의 경우 인도네시아에서는 강우량이 증가하는 반면 중부 및 동부 열대 태평양에서는 강우량이 감소합니다.

      • 적도를 따라 흐르는 동쪽의 바람은 더욱 강해집니다. 일반적으로 해수면 온도가 평상시보다 낮을수록 La Nina가 강해집니다 (그 반대도 마찬가지).

    • 중립

      • El Nino 또는 La Nina로서 열대 태평양에서 평균 해수면 온도 (SST)는 일반적으로 평균에 가깝습니다.

      • 그러나 바다가 El Nino 또는 La Nina 상태 인 것처럼 보일 수 있으나 대기가 따라 가지 않는 (또는 그 반대) 경우가 있습니다.

  • 따라서 이 포스팅에서는 rsol 패키지를 통해 쉽게 엘니뇨-남방진동 자료 다운로드 및 가시화를 소개해 드리고자 합니다.

 

[특징]

  • 엘니뇨-남방진동 분석하기 위해서 다운로드 및 가시화 기술이 요구되며 이 프로그램은 이러한 목적을 달성하기 위한 소프트웨어

 

[기능]

  • 자료 다운로드 

  • 가시화

 

[활용 자료]

  • 없음

 

[자료 처리 방안 및 활용 분석 기법]

  • 없음

 

[사용법]

  • 소스 코드 참조

 

[사용 OS]

  • Windows 10

 

[사용 언어]

  • R v3.6.3

  • R Studio v1.2.5033

 

 소스 코드

[명세]

  • 전역 설정

    • 최대 10 자리 설정

    • 메모리 해제

    • 영어 인코딩 설정

    • 폰트 설정

# Set Option
memory.limit(size = 9999999999999)
options(digits = 10)
Sys.setlocale("LC_TIME", "english")
font = "Palatino Linotype"

 

  • 라이브러리 읽기

    • rsoi : ENSO 데이터에 쉽게 접근하고 다운로드하는 패키지로서 Sam Albers (2020)에 출시

# Library Load
library(extrafont)
library(tidyverse)
library(rsoi)
library(plotly)

 

  • 자료 다운로드

    • rsoi::download_enso를 통해 데이터 프레임 (Data Frame) 형식으로 데이터 다운로드

    • 그 결과 dplyr::glimpse 또는 dplyr::tbl_df를 통해 데이터의 내부 구조를 확인 가능

dfEnso = rsoi::download_enso()

dplyr::tbl_df(dfEnso)

 

etc-image-0

 

  • 가시화

    • 데이터 세트에서 정보는 여전히 숨겨져 있기 때문에 가시화 필요

    • 가시화는 일반적인 정적 탐색 데이터 분석에서 웹 브라우저의 동적 대화식 데이터 시각화에 이르기까지 다양함

    • 특히 R의 기본 plot으로 여러 미학적 측면을 제어 할 수 있으나 Hadley Wickham (2016)이 개발한 ggplot2는 새로운 방법으로 시각화하기 때문에 이를 사용 

 

  • 가시화를 위한 초기 설정

  • ggplot2를 이용한 가시화

# Visualization Using ggplot2
sMinDate = "1950-01-01"
sMaxDate = "2020-01-01"

ggplot(data = dfEnso, aes(x = Date, y = ONI, fill = phase)) +
   theme_bw() +
   geom_col() +
   scale_x_date(expand = c(0, 0), date_breaks = "10 years", date_labels = "%Y", limits = as.Date(c(sMinDate, sMaxDate))) +
   scale_y_continuous(expand = c(0, 0), breaks = seq(-2, 2, 1), limits = c(-2, 2)) +
   labs(
      x = "Date [Year]"
      , y = "ENSO Index"
      , fill = "Phase"
      , title = "El Nino-Southern Oscillation"
      , subtitle = "Period : February 01, 1951 - July 01, 2019"
      , caption = "Source : rsoi"
      ) +
   theme(
      plot.title = element_text(face = "bold", size = 18, color = "black")
      , axis.title.x = element_text(face = "bold", size = 18, colour = "black")
      , axis.title.y = element_text(face = "bold", size =18, colour = "black", angle=90)
      , axis.text.x  = element_text(face = "bold", size = 18, colour = "black")
      , axis.text.y  = element_text(face = "bold", size = 18, colour = "black")
      , legend.title = element_text(face = "bold", size = 14, colour = "black")
      , legend.position = "bottom"
      , legend.justification = c(0, 0.96)
      , legend.key = element_blank()
      , legend.text = element_text(size = 14, colour = "black")
      , legend.background = element_blank()
      , text = element_text(family = font)
      , plot.margin = unit(c(0, 8, 0, 0), "mm")
      ) + 
   ggsave(filename = paste0("FIG2/ggplot2_ENSO_Index.png"), width = 12, height = 8, dpi = 600)

 

etc-image-1

 

[전체]

#======================================================================================================================================
# Routine : Main R program
#
# Purpose : Visualization and Download El NinoSouthern Oscillation Data Using the rsoi Package
#
# Author : MS. Sang-Ho Lee
#
# Revisions: V1.0 March 08, 2019 First release (MS. Sang-Ho Lee)
#======================================================================================================================================
# Set Option
memory.limit(size = 9999999999999)
options(digits = 10)
Sys.setlocale("LC_TIME", "english")
font = "Palatino Linotype"
# Library Load
library(extrafont)
library(tidyverse)
library(rsoi)
library(plotly)
dfEnso = rsoi::download_enso()
dplyr::tbl_df(dfEnso)
# Visualization Using ggplot2
sMinDate = "1950-01-01"
sMaxDate = "2020-01-01"
ggplot(data = dfEnso, aes(x = Date, y = ONI, fill = phase)) +
theme_bw() +
geom_col() +
scale_x_date(expand = c(0, 0), date_breaks = "10 years", date_labels = "%Y", limits = as.Date(c(sMinDate, sMaxDate))) +
scale_y_continuous(expand = c(0, 0), breaks = seq(-2, 2, 1), limits = c(-2, 2)) +
labs(
x = "Date [Year]"
, y = "ENSO Index"
, fill = "Phase"
, title = "El Nino-Southern Oscillation"
, subtitle = "Period : February 01, 1951 - July 01, 2019"
, caption = "Source : rsoi"
) +
theme(
plot.title = element_text(face = "bold", size = 18, color = "black")
, axis.title.x = element_text(face = "bold", size = 18, colour = "black")
, axis.title.y = element_text(face = "bold", size =18, colour = "black", angle=90)
, axis.text.x = element_text(face = "bold", size = 18, colour = "black")
, axis.text.y = element_text(face = "bold", size = 18, colour = "black")
, legend.title = element_text(face = "bold", size = 14, colour = "black")
, legend.position = "bottom"
, legend.justification = c(0, 0.96)
, legend.key = element_blank()
, legend.text = element_text(size = 14, colour = "black")
, legend.background = element_blank()
, text = element_text(family = font)
, plot.margin = unit(c(0, 8, 0, 0), "mm")
) +
ggsave(filename = paste0("FIG2/ggplot2_ENSO_Index.png"), width = 12, height = 8, dpi = 600)

 

 참고 문헌

[논문]

  • 없음

[보고서]

  • 없음

[URL]

  • 없음

 

 문의사항

[기상학/프로그래밍 언어]

  • sangho.lee.1990@gmail.com

[해양학/천문학/빅데이터]

  • saimang0804@gmail.com