IDL/New Graphics

SetData 메서드의 활용 예제 [2]

이상우_idl 2022. 6. 30. 14:13
728x90
반응형

NG 체계에서 SetData 메서드를 활용하는 예제를 얼마전에 관련게시물을 통하여 소개했던 바 있는데, 오늘은 그 두번째 순서입니다. 지난 첫번째 예제에서는 1차원 플롯 데이터를 대상으로 했었는데 이번 두번째 예제에서는 2차원 데이터를 대상으로 해보겠습니다. 그래서 2차원 데이터 배열을 이미지의 형태로 표출한 다음 SetData 메서드를 적용하는 예제를 소개해보도록 하겠습니다. 그러면 다음과 같이 500x500의 2차원 구조를 갖는 실수형 배열 data를 생성하고 IMAGE 함수를 사용하여 표출해봅시다.

 

data = HANNING(500, 500)*10
data_scl = BYTSCL(data, MIN=0, MAX=100)
win = WINDOW(DIMENSIONS=[600, 600], /NO_TOOLBAR)
im = IMAGE(data_scl, RGB_TABLE=34, $
  MARGIN=0.1, AXIS_STYLE=2, XTICKLEN=0, YTICKLEN=0, /CURRENT)

cb = COLORBAR(TARGET=im, RANGE=[0, 100], POSITION=[0.2, 0.95, 0.8, 0.98])

 

여기서 생성한 배열 data의 값들은 0~10의 범위를 갖게 됩니다. 그런데 바로 이어서 BYTSCL 함수를 사용하여 0~100의 범위로 바이트스케일링(Byte Scaling)을 적용한 결과를 data_scl이라는 배열로 얻었습니다. 이것은 이 데이터의 유효 범위가 0~100이라고 가정한 것입니다. 즉 가능한 유효 범위는 0~100이지만 데이터를 얻는 시점 및 상황에 따라서 그 안에서 유동적으로 변할 수 있고 지금은 0~10의 범위를 갖는 경우에 해당된다는 가정입니다. 이러한 처리를 거친 data_scl을 IMAGE 함수로 표출하면 아무래도 컬러테이블의 맨 앞부분 색상들만 사용이 될 것입니다. 따라서 표출된 모습을 보면 다음 그림과 같습니다.

 

 

이와 같이 데이터 값의 범위에 따라 제한적으로만 컬러가 사용되었음을 볼 수 있습니다. 그러면 이제 이러한 데이터를 시간에 따라 계속 얻어봤더니 최대값이 계속 증가했다는 가정을 하나 더 해봅시다. 이러한 데이터를 동일한 방법으로 표출해보면 그 모습도 계속 달라질 것입니다. 그러한 변화의 모습을 표출하는 과정의 예는 다음과 같습니다.

 

FOR j = 10, 100 DO BEGIN
  data_new = HANNING(500, 500)*j
  data_new_scl = BYTSCL(data_new, MIN=0, MAX=100)
  im.SetData, data_new_scl
ENDFOR

 

이와 같이 반복형 구문 내에서 2차원적 구조는 동일하지만 값 범위가 달라진 새로운 데이터 배열을 가정하고 생성하여 바이트스케일링 처리를 거친 후 표출되도록 하는 것입니다. 이 때 SetData 메서드를 사용함으로써 우리가 앞서 표출했던 이미지 그림의 틀을 그대로 사용하되 거기에 반영되는 데이터만 살짝 바꿔치기해주는 것이고 이러한 작업을 순차적으로 반복하는 것입니다. 이 내용을 실행하면 새로운 데이터의 값 범위가 0~10, 0~11, 0~12, ......, 0~99, 0~100의 순서로 계속 바뀌면서 그 데이터가 동일한 컬러테이블 기반으로 표출되기 때문에 그림의 색상 분포도 계속 변하게 됩니다. 그러한 변화는 여러분이 화면에서 직접 보실 수 있습니다. 물론 그냥 화면으로 보는 것에서 그치지 않고 전체 과정을 결과물로 저장하는 것도 가능합니다. 그러면 이러한 변화를 애니메이션 GIF 파일로 저장하기 위하여 위의 내용을 다음과 같이 수정해봅시다.

 

gif_file = 'setdata_2.gif'
FOR j = 10, 100 DO BEGIN
  data_new = HANNING(500, 500)*j
  data_new_scl = BYTSCL(data_new, MIN=0, MAX=100)
  im.SetData, data_new_scl
  cap = win.CopyWindow(WIDTH=600)
  frame = COLOR_QUAN(cap, 1, r, g, b)
  WRITE_GIF, gif_file, frame, r, g, b, /MULTIPLE, $
    DELAY_TIME=2, REPEAT_COUNT=0
ENDFOR
WRITE_GIF, gif_file, /CLOSE

 

앞서 제시했던 반복형 구문의 내용에 애니메이션 GIF 생성을 위한 내용이 추가된 것입니다. 새로 추가된 내용은 볼드체로 표시하였습니다. 이 과정을 실행하면 setdata_2.gif라는 애니메이션 GIF 파일을 얻게 됩니다. 그 모습은 다음과 같습니다.

 

 

앞선 예제에서는 2차원 데이터의 최대값이 계속 증가하는 변화를 구현하였는데, 이번에는 데이터의 최대치가 100까지 증가했다가 다시 감소하는 변화를 구현해볼 수도 있습니다. 다만 이러한 작업을 위해서는 증가하는 과정 및 감소하는 과정을 별도의 반복형 구문으로 작성해야 할 것 같습니다. 따라서 아예 애니메이션 GIF 파일을 생성하는 내용까지 다 포함하여 작성해본다면 다음과 같습니다.

 

gif_file = 'setdata_2.gif'
FOR j = 10, 100 DO BEGIN
  data_new = HANNING(500, 500)*j
  data_new_scl = BYTSCL(data_new, MIN=0, MAX=100)
  im.SetData, data_new_scl
  cap = win.CopyWindow(WIDTH=600)
  frame = COLOR_QUAN(cap, 1, r, g, b)
  WRITE_GIF, gif_file, frame, r, g, b, /MULTIPLE, $
    DELAY_TIME=2, REPEAT_COUNT=0
ENDFOR
FOR j = 100, 10, -1 DO BEGIN
  data_new = HANNING(500, 500)*j
  data_new_scl = BYTSCL(data_new, MIN=0, MAX=100)
  im.SetData, data_new_scl
  cap = win.CopyWindow(WIDTH=600)
  frame = COLOR_QUAN(cap, 1, r, g, b)
  WRITE_GIF, gif_file, frame, r, g, b, /MULTIPLE, $
    DELAY_TIME=2, REPEAT_COUNT=0
ENDFOR
IF gif_sav THEN WRITE_GIF, gif_file, /CLOSE

 

좀 길어보이지만 변화의 방식만 서로 다를 뿐 근본적인 틀은 두 반복형 구분이 서로 거의 유사합니다. 다만 볼드체로 표시된 부분들에서 볼 수 있듯이 반복인수 j가 변화하는 방식이 서로 다름에 유의하면 됩니다. 이와 같은 과정을 실행하여 새롭게 얻은 애니메이션 GIF 파일의 모습은 다음과 같습니다.

 

반응형