IDL/New Graphics

VECTOR 함수를 이용하여 벡터 필드 표출하기 [1]

이상우_IDL 2017. 11. 30. 16:48
728x90

오늘은 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 함수에 관한 내용은 아직 좀 남은 것이 있어서 다음 회에서 이어서 언급하도록 하겠습니다.

LIST