오늘은 NG 체계에서 지원되는 그래픽 함수들 중 VECTOR 함수를 사용하는 방법 및 예제에 관하여 다뤄보기로 하겠습니다. 통상적으로 풍향/풍속 데이터를 가시화하는데 자주 사용되는 벡터 필드(Vector Field)라고 부르는 표출 방식이 있습니다. 벡터들을 화살표의 형태로 가시화하는 방식인데, 이러한 표출을 위하여 사용 가능한 기능이 바로 이 VECTOR 함수입니다. 사실 이와 같은 데이터들은 존재하는 방식이 크게 두가지인데 하나는 u, v, x, y의 형태이고 또 하나는 방향(direction), 크기(magnitude)의 형태입니다. 물론 두 방식은 사실상 본질은 같고 다만 값들의 표시 방식만 다를 뿐입니다. 오늘 언급하고자 하는 VECTOR 함수의 경우는 전자의 방식 즉 u, v, x, y의 형태로 인수를 받도록 되어 있습니다.
graphic = VECTOR(u, v, x, y, ~~~)
그러면 예제를 보면서 VECTOR 함수의 사용법을 보기로 합시다. 먼저 다음과 같이 예제 데이터를 만들어보았습니다.
x = [10:80:10.]
y = [10:60:10.]
u = RANDOMU(-1, N_ELEMENTS(x), N_ELEMENTS(y))*2-1
v = RANDOMU(-5, N_ELEMENTS(x), N_ELEMENTS(y))*2-1
여기서는 데이터 포인트들이 8x6의 격자 형태로 존재하며, 테이터 포인트들의 위치는 X축 방향으로는 10부터 80까지 10의 간격이고 Y축 방향으로는 10부터 60까지 10의 간격이라고 가정하였습니다. 그리고 각 벡터의 크기는 -1부터 +1까지의 범위를 가지며, 그 방향은 각도상으로 0~360 범위내에서 어떤 방향이든 가능한 것으로 가정하였습니다. 이러한 데이터는 다음과 같이 VECTOR 함수를 적용하여 벡터 필드의 형태로 표출해 볼 수 있습니다. 그리고 그 결과는 다음 그림과 같습니다.
win1 = WINDOW(DIMENSIONS=[600, 500], /NO_TOOLBAR)
vec1 = VECTOR(u, v, x, y, AXIS_STYLE=2, ARROW_THICK=3, $
COLOR='green', XRANGE=[0, 90], YRANGE=[0, 70], /CURRENT)
기본적으로는 마치 PLOT 함수를 사용할 때처럼 XY축 공간이 준비된 상태에서 각 데이터 포인트 위치마다 크기와 방향에 따라 화살표를 표시하는 방식이라고 보면 됩니다. 물론 IDL 도움말에서 VECTOR 함수에 관하여 좀 찾아보면 꽤 많은 키워드 및 속성들이 지원되는 것을 볼 수 있는데요. 화살표의 표출 방식을 제어하기 위한 각종 기능들이 지원되기 때문입니다. 여기서 일일이 다 언급하긴 힘들지만 몇가지만 살펴보겠습니다. 가장 먼저 LENGTH_SCALE이란 속성이 있는데, 위의 내용에서 다음과 같이 이 속성만 추가하여 사용해보면 그 결과는 다음 그림과 같습니다.
win1 = WINDOW(DIMENSIONS=[600, 500], /NO_TOOLBAR)
vec1 = VECTOR(u, v, x, y, AXIS_STYLE=2, ARROW_THICK=3, $
COLOR='green', XRANGE=[0, 90], YRANGE=[0, 70], $
LENGTH_SCALE=2, /CURRENT)
이 속성의 이름만으로도 알 수 있듯이 바로 화살표들의 길이에 대한 스케일을 지정하는 역할입니다. 기본값이 1이므로 위와 같이 2로 설정하면 두 배의 길이로 표출하게 됩니다. 또 하나 주목해둘만한 속성은 DATA_LOCATION입니다. 이것은 화살표 하나하나에 대하여 화살표의 위치와 데이터 포인트의 위치 사이의 관계를 설정하는 역할인데요. 이해를 돕기 위하여 다음과 같이 별도의 그래픽창을 띄우고 위와 같은 방식으로 벡터들을 표출하되, 각 데이터 포인트들의 위치를 반복문을 사용하여 원형 심볼로 표시해보았습니다. 그 결과는 다음 그림과 같습니다.
win2 = WINDOW(DIMENSIONS=[600, 500], /NO_TOOLBAR)
vec2 = VECTOR(u, v, x, y, AXIS_STYLE=2, ARROW_THICK=3, $
DATA_LOCATION=1, COLOR='green', XRANGE=[0, 90], YRANGE=[0, 70], $
LENGTH_SCALE=1, /CURRENT)
FOR j = 0, N_ELEMENTS(y)-1 DO BEGIN
FOR i = 0, N_ELEMENTS(x)-1 DO BEGIN
sym = SYMBOL(x[i], y[j], 'circle', /SYM_FILLED, $
SYM_COLOR='red', SYM_SIZE=0.7, /DATA)
ENDFOR
ENDFOR
이 그림에서 볼 수 있듯이, 각 화살표는 그 중심 부분이 데이터 포인트의 위치가 되도록 표시됩니다. 그런데 데이터 포인트의 위치가 화살표의 시작점이 되어야 할 수도 있고, 화살표의 끝점이 되어야 할 수도 있습니다. 이를 제어하는 것이 바로 DATA_LOCATION 속성의 역할입니다. 이 속성은 기본값이 1인데 0 또는 2로 설정하면 그 모습은 달라집니다. 만약 위의 내용에서 이 값만 0으로 변경하면 그 결과는 다음 그림과 같습니다.
그림에서 보이는 것처럼 각 데이터 포인트의 위치가 화살표의 시작점이 되는 형태로 표출됩니다. 만약 DATA_LOCATION 속성의 값을 2로 변경하면 그 결과는 다음 그림과 같습니다. 이 경우에는 그림에서 보이는 것처럼 각 데이터 포인트의 위치가 화살표의 끝점이 되는 형태로 표출됩니다.
화살표의 머리 부분(head)의 형태를 제어하는 속성들도 있는데 그 중 HEAD_SIZE라는 것이 있습니다. 이 속성은 기본값이 1.0인데 만약 다음과 같이 2로 설정하면 기본 형태보다 머리 크기가 두 배가 됩니다.
win3 = WINDOW(DIMENSIONS=[600, 500], /NO_TOOLBAR)
vec3 = VECTOR(u, v, x, y, AXIS_STYLE=2, ARROW_THICK=3, $
HEAD_SIZE=2, COLOR='green', XRANGE=[0, 90], YRANGE=[0, 70], $
/CURRENT)
만약 이 속성의 값을 0.5로 설정할 경우에는 기본 형태보다 머리 크기가 절반이됩니다.
그리고 HEAD_PROPORTIONAL이라는 속성도 있는데, 다음과 같이 이 속성을 활성화하면 화살표 머리 부분의 크기가 화살표 길이에 비례하도록 표출됩니다.
win3 = WINDOW(DIMENSIONS=[600, 500], /NO_TOOLBAR)
vec3 = VECTOR(u, v, x, y, AXIS_STYLE=2, ARROW_THICK=3, $
HEAD_SIZE=1, /HEAD_PROPORTIONAL, COLOR='green', XRANGE=[0, 90], $
YRANGE=[0, 70], /CURRENT)
이 속성이 사용되지 않은 디폴트 상태에서는 화살표 머리 부분의 크기는 길이에 관계없이 일괄적으로 표시가 됩니다. 물론 이 속성을 활성화할 경우에는, 화살표 길이가 짧을수록 머리 부분의 크기도 너무 작아질 수 있다는 단점이 있긴 합니다.
오늘은 VECTOR 함수를 사용하는 기본적인 방법 및 관련 예제들을 살펴보았습니다. VECTOR 함수에 관한 내용은 아직 좀 남은 것이 있어서 다음 회에서 이어서 언급하도록 하겠습니다.
'IDL > New Graphics' 카테고리의 다른 글
Windows 10용 IDL에서 NG 체계 그림 저장 문제 및 해결 방법 (0) | 2018.02.12 |
---|---|
VECTOR 함수를 이용하여 벡터 필드 표출하기 [2] (0) | 2017.12.07 |
NG 체계에서 지도상에 이미지를 중첩할 때 격자가 어긋나는 현상에 관하여 (4) | 2017.10.27 |
SCATTERPLOT3D 함수 소개 및 사용법 예제 (0) | 2017.10.11 |
눈금값의 포맷(Tick Format)을 변경하는 방법 (0) | 2017.07.11 |