IDL에서 다수의 벡터(Vector)들을 화살표의 형태로 표시하는 기능을 담당하는 VECTOR 함수에 관해서는 이미 몇몇 관련 게시물들(링크1, 링크2)을 통하여 소개한 바 있습니다. 그런데 이 게시물들에서는 벡터들을 화살표(Arrow)의 형태로 표시하는 방법 위주로만 소개를 하였습니다. 물론 VECTOR 함수의 주 기능은 벡터들을 화살표 형태로 표시하는 것이긴 합니다. 하지만 화살표(Arrow) 외에도 바람깃(Wind Barb)의 형태로 표시하는 기능도 포함되어 있습니다. 이러한 방식의 표출은 특히 기상 분야에서 자주 사용되는 방식이기도 합니다. 그래서 VECTOR 함수를 사용하여 벡터들을 바람깃(Wind Barb)의 형태로 표시하는 방법에 촛점을 맞춰서 관련 예제와 함께 살펴보는 내용을 2회에 걸쳐서 소개해보고자 합니다.
일단 예제로 사용할 간단한 데이터를 가상으로 생성해봅시다. 물론 VECTOR 함수에 투입할 수 있는 형태가 되어야 하므로 다음과 같이 u, v, x, y로 구성하면 됩니다.
x = [20, 30, 60, 80]
y = [50, 40, 30, 70]
u = [2.1, 11.6, -6.3, 5.9]
v = [-3.2, 17.4, -9.8, 3.6]
여기서 x 및 y는 각 벡터의 위치 좌표이고, u 및 v는 각 벡터의 X방향 및 Y방향 성분값들입니다. 그리고 이 데이터를 오늘의 주제에 맞게 바람(Wind) 데이터라고 가정해보겠습니다. 즉 u 및 v는 바람 벡터의 U 및 V 성분값 배열이라고 가정합니다. 이러한 배열들을 VECTOR 함수에 투입하면 됩니다. 일단 벡터들을 화살표의 형태로 표출하는 방식으로 먼저 진행해봅시다. 그 과정은 대략 다음과 같습니다.
win1 = WINDOW(DIMENSIONS=[600, 600], /NO_TOOLBAR)
vec1 = VECTOR(u, v, x, y, AXIS_STYLE=2, ARROW_THICK=3, $
COLOR='crimson', XRANGE=[0, 100], YRANGE=[0, 100], $
HEAD_SIZE=2, /HEAD_PROPORTIONAL, DATA_LOCATION=2, $
LENGTH_SCALE=2, FONT_SIZE=11, MARGIN=0.1, /CURRENT)
sp1 = SCATTERPLOT(x, y, SYMBOL='circle', /SYM_FILLED, $
SYM_COLOR='crimson', /OVERPLOT)
여기서는 VECTOR 함수를 사용하는 것 외에도 SCATTERPLOT 함수도 추가로 사용하여 각 지점의 위치를 점으로 표시해보았습니다. 그리고 VECTOR 함수에서 DATA_LOCATION 속성을 2로 설정하여 화살표들이 각 지점별 위치로 향하는 방식으로 표시되도록 하였습니다. 그리고 화살 머리의 크기가 화살의 길이와 연동되도록 하기 위하여 /HEAD_PROPORTIONAL 키워드도 사용하였습니다. 이러한 과정에 의하여 표출된 그림은 다음과 같습니다.
그러면 이번에는 이러한 벡터 데이터를 바람깃(Wind Barb)의 형태로 표출해봅시다. 이를 위해서는 VECTOR 함수를 사용하면서 VECTOR_STYLE 속성의 값을 1로 설정하는 것이 반드시 필요합니다. 참고로 이 속성의 디폴트 값은 0이며 이 경우에는 벡터들을 화살표로 표시하게 됩니다. 그러면 새로운 그래픽창을 띄우고 여기서는 벡터들을 바람깃의 형태로 표출해봅시다. 그 과정은 대략 다음과 같이 처리해봅니다.
win2 = WINDOW(DIMENSIONS=[600, 600], /NO_TOOLBAR)
vec2 = VECTOR(u, v, x, y, AXIS_STYLE=2, THICK=3, $
COLOR='crimson', XRANGE=[0, 100], YRANGE=[0, 100], $
VECTOR_STYLE=1, HEAD_SIZE=2, DATA_LOCATION=2, $
LENGTH_SCALE=2, FONT_SIZE=11, MARGIN=0.1, /CURRENT)
sp2 = SCATTERPLOT(x, y, SYMBOL='circle', /SYM_FILLED, $
SYM_COLOR='crimson', /OVERPLOT)
여기서는 앞서 언급한 것과 같이 VECTOR_STYLE 속성을 1로 설정하는 것이 가장 중요합니다. 나머지 내용은 앞서 화살표로 표시할 때와 크게 다르지는 않습니다. 일단 이러한 과정에 의하여 표출된 그림을 보면 다음과 같습니다.
이 그림을 보면 벡터들이 바람깃(Wind Barb)의 형태로 표시된 것을 확인할 수 있습니다. 기존의 화살표 형태의 표시 방식과 비교하여 몇가지 유의사항들을 좀 살펴보면, 먼저 전반적인 두께는 THICK 속성으로 조정하면 됩니다. 그리고 전반적인 깃대(주축)의 길이는 LENGTH_SCALE 속성을 사용하여 조절할 수 있습니다. 그리고 깃대의 끝에서 돌출되어 표시되는 깃(Barb)들의 길이는 HEAD_SIZE 속성을 사용하여 조절하면 됩니다. 다만 이와 같이 바람깃의 형태로 표시할 경우에는 모든 벡터들의 깃대의 길이는 동일합니다. 그 대신 바람의 세기 즉 풍속의 크기는 깃(Barb)들의 길이 및 갯수로 표시됩니다. 그 구체적인 표시 방식은 기상학적인 바람깃 표시의 방식을 그대로 따릅니다. 이와 관련된 내용은 웹상에서 검색을 좀 해보면 여러가지 관련 정보들을 얻을 수 있는데, 일단 제가 검색해본 링크를 한번 참조해보시면 될 것 같습니다.
여기서 또 하나 유의할 것은 이러한 바람깃 표시 방식에 있어서는 풍속을 따지는 기준이 노트(Knot) 단위라는 것입니다. 참고를 위하여 앞서 맨 처음에 가상으로 생성했던 u 및 v 배열들을 사용하여 풍속의 값을 계산하여 출력해보면 다음과 같습니다.
ws = SQRT(u^2+v^2)
PRINT, ws
3.82753 20.9122 11.6503 6.91158
이 값들을 보면 최대 풍속은 20.9 정도로 확인됩니다. 위의 그림에서 풍속이 가장 큰 벡터의 깃 부분을 보면 두 개의 선들이 보입니다. 이것은 풍속의 값을 노트(Knot) 단위로 인지하였기 때문에 그렇게 표시가 된 것입니다. 그런데 만약 투입되는 데이터의 풍속 값이 다른 단위 즉 예를 들어 m/s 단위일 경우라면 이를 노트 단위로 변환을 해줘야 합니다. 그러면 이번에는 u, v 데이터의 단위가 m/s라고 가정을 하고 이를 노트 단위로 변환해봅시다. 참고로 m/s를 노트 단위로 변환하는 배율은 약 1.944입니다.
ukn = u*1.944
vkn = v*1.944
wskn = ws*1.944
PRINT, wskn
7.44072 40.6533 22.6482 13.4361
출력된 값들을 보면 최대 풍속이 약 40.7 노트인 것을 알 수 있습니다. 그러면 앞서 제시된 VECTOR 함수에 이 데이터를 대신 투입하여 다시 실행해봅시다.
vec2 = VECTOR(ukn, vkn, x, y, ~~~~~~)
그러면 결과는 다음 그림과 같습니다. 노트 단위로 변환하면서 값들이 더 커졌고 바람깃들의 형태도 그에 맞게 표시가 된 것을 볼 수 있습니다.
따라서 VECTOR 함수를 사용하여 벡터들을 표시하는데 있어서 화살표 대신 바람깃(Wind Barb)의 형태로 표시되도록 하려면 대략 위와 같은 방식으로 작업을 하면 됩니다.
얼마전에 기상청 ASOS 자료를 사용하여 풍속 및 풍향을 벡터 화살표의 형태로 표출하는 예제를 관련 게시물을 통하여 소개한 바 있습니다. 거기서는 VECTOR 함수를 사용하여 화살표의 형태로 표시하였는데요. 그 데이터를 그대로 사용하여 오늘 제시된 바람깃 형태로 표출하는 방법을 적용해볼 수 있습니다. 물론 그 데이터는 m/s 단위이기 때문에 아까처럼 노트(Knot) 단위로 변환하는 것이 필요합니다. 어쨌든 이와 같은 방식으로 적절한 처리를 거쳐서 얻어본 그림을 보면 다음과 같습니다.
실제로 이 데이터의 경우 풍속의 최대값이 흑산도 지점(경도 125.45, 위도 34.69)의 9.4(m/s)인데 노트 단위로는 약 18.3 정도가 됩니다. 따라서 이 위치의 바람깃을 보면 깃 부분의 형태가 그러한 값을 반영하고 있음을 확인할 수 있습니다.
따라서 VECTOR 함수를 사용하여 이와 같은 방식의 표출을 하는 것도 가능하다는 점을 참조해두시면 됩니다. 그리고 오늘 표출된 그림들에서는 바람깃들을 모두 단일 색상으로 표시하였는데요. 컬러테이블을 적용하여 바람깃들을 다양한 색상으로 표시하는 것도 가능합니다. 이 방법에 관해서는 다음 회차에서 다뤄보기로 하겠습니다.
이 글이 도움이 되었다면 게시물에 대하여 공감 버튼(하트 모양) 클릭 및 블로그 구독도 해주시면 더 큰 힘이 됩니다. 감사합니다.
'IDL > New Graphics' 카테고리의 다른 글
색상을 채운 플롯(Filled Plot)의 표출 [1] (0) | 2025.03.10 |
---|---|
VECTOR 함수로 바람깃(Wind Barb) 표시하기 [2] (0) | 2025.02.25 |
그래픽 창의 캡쳐(capture) 기능 (NG 체계) (0) | 2024.11.21 |
동영상 파일의 제작 [3] (Animation GIF) (3) | 2024.11.13 |
동영상 파일의 제작 [2] (WRITE_VIDEO) (2) | 2024.11.12 |