학부 강의 노트/기상분석기술

기상 분석 :: 호도 그래프 (코드 포함)

airmaster 2024. 4. 17. 16:44
728x90

호도그래프

대기 중의 풍향과 풍속의 수직 분포를 시각적으로 나타내는 도구

극 좌표계 사용. 

원점에서 높이에 따른 방향과 속도를 기반으로 풍향을 매핑.

 

목적: 호도그래프를 통해 악기상 구조와 진화를 예측하는 데 중요한 요소인 특정 깊이에서의 수직 풍향 전단의 총 크기를 파악할 수 있다.


호도그래프를 작성하는 과정

풍향 벡터 플롯: 각 높이에서의 풍향과 풍속을 벡터로 표현하고, 이를 극 좌표 차트에 플롯한다. 이때, 벡터의 길이는 풍속을, 방향은 풍향을 나타낸다.
벡터 연결: 각 높이에서의 풍향 벡터의 끝점을 연결하여 호도그래프를 생성합니다. 이렇게 하면, 높이에 따른 풍향과 풍속의 변화를 한 눈에 파악할 수 있다.
높이 또는 압력 레벨 표시: 각 풍향 벡터의 끝에 적절한 높이 또는 기압을 표시합니다. 이를 통해 각 높이에서의 풍향과 풍속을 알 수 있다.

 

 

 

호도그래프 그리는 R코드

hodograph <- function (x, y, t, rings, ringlabels = TRUE, tcut = c ("daily", "yearly"), ...) {  
  tcut <- match.arg (tcut)  
  if (missing (t)) {  
    stop ("x-y method not coded yet\\n")  
  } else {  
    if (!missing (y)) {  
      stop ("cannot give y if t is given\\n")  
    }  
    if (tcut == "yearly") {  
      t <- as.POSIXlt (t)  
      start <- ISOdatetime (1900 + as.POSIXlt (t [1])$year, 1, 1, 0, 0, 0, tz = attr (t, "tzone"))  
      day <- as.numeric (julian (t, origin = start))  
      xx <- x * cos (day/365 * 2 * pi)  
      yy <- x * sin (day/365 * 2 * pi)  
      if (missing (rings)) rings <- pretty (sqrt (xx^2 + yy^2))  
      rscale <- 1.04 * max (rings)  
      theta <- seq (0, 2 * pi, length.out = 200)  
      plot (xx, yy, asp = 1, xlim = rscale * c (-1.1, 1.1), ylim = rscale * c (-1.1, 1.1), type = "n", xlab = "", ylab = "", axes = FALSE)  
      month <- c ("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec")  
      day <- c (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)  
      rscale <- max (rings)  
      for (m in 1:12) {  
        phi <- 2 * pi * (sum (day [1:m]) - day [1])/sum (day)  
        lines (rscale * 1.1 * cos (phi) * c (0, 1), rscale * 1.1 * sin (phi) * c (0, 1), col = "gray")  
        phi <- 2 * pi * (0.5/12 + (m - 1)/12)  
        text (1.15 * rscale * cos (phi), 1.15 * rscale * sin (phi), month [m])  
      }  
      for (r in rings) {  
        if (r > 0) {  
          gx <- r * cos (theta)  
          gy <- r * sin (theta)  
          lines (gx, gy, col = "gray")  
          if (ringlabels) text (gx [1], 0, format (r))  
        }  
      }  
      points (xx, yy, ...)  
    } else {  
      stop ("only tcut=\"yearly\" works at this time\\n")  
    }  
  } 
}
728x90