NG 체계에서 그래픽 개체를 생성해놓은 후 개별 속성을 나중에 제어하기 위하여 SetData 메서드를 사용할 수 있다는 것에 대해서는 제가 예전에 관련게시물을 통하여 소개해드린 바 있습니다. 이 방법을 이용하면 여러가지 다양한 처리들이 가능하고 그러한 예제들은 종류가 굉장히 많습니다. 그래서 저도 생각나는대로 그런 예제들을 지속적으로 소개해보고자 합니다. 오늘은 그 첫번째 예제로서 N개의 데이터 포인트들로 구성된 플롯에 대하여 SetData 메서드를 적용하는 예제를 살펴보겠습니다. 다음과 같이 201개의 데이터 포인트들로 구성된 예제 데이터 x, y를 생성하고 그래픽창에 플롯으로 표출해봅시다.
x = FINDGEN(201)
y = SIN(2*x*!DTOR)*5+RANDOMU(seed, 201)
win = WINDOW(DIMENSIONS=[600, 500], /NO_TOOLBAR)
p = PLOT(x, y, XRANGE=[0, 200], YRANGE=[-6, 6], $
/NODATA, FONT_SIZE=11, /CURRENT)
여기서는 데이터 생성에 있어서 난수 생성 기능(RANDOMU 함수)이 사용되었기 때문에 세부적인 실제 값들은 여러분이 얻으시는 것과 다를 수 있습니다. 일단 이 과정에 의하여 표출된 모습은 다음 그림과 같습니다.
뭔가 좀 이상하단 느낌이 드실 수 있는데, 여기서는 일단 PLOT 함수에서 /NODATA 키워드를 사용함으로써 플롯의 X, Y 축과 같은 기본 틀만 표출하고 데이터 포인트들은 일부러 표시하지 않았습니다. 이제 다음과 같이 PLOT 함수를 한번 더 사용해봅시다.
po = PLOT(x[0:0], y[0:0], COLOR='tomato', SYMBOL='circle', $
/SYM_FILLED, SYM_SIZE=0.5, CLIP=0, /OVERPLOT)
여기서는 전체 201개의 데이터 포인트들 중 첫번째 포인트 하나만 원형 심볼 형태로 표시가 되도록 하였습니다. 따라서 표출된 모습은 다음과 같은데, 이 그림에서 맨 왼쪽(x=0)에 첫번째 데이터 포인트 하나만 표시된 것을 잘 확인해보시기 바랍니다.
여기까지는 그림이 너무 조촐한 감이 있었는데, 이제부터가 진짜입니다. 이번에는 다음과 같은 반복형 구문을 추가해봅시다.
FOR j = 1, 200 DO BEGIN
po.SetData, x[0:j], y[0:j]
ENDFOR
이 상태로 실행을 해보면 데이터 포인트들이 순차적으로 늘어나면서 표시되는 효과를 얻을 수 있습니다. 여기서는 SetData 메서드를 사용하면서 그 인수로 x[0:j] 및 y[0:j]를 사용하여 표시될 범위가 0부터 j가 되도록 하였는데, 결국 매 반복회차마다 플롯 개체 po로 표시될 데이터 포인트들을 변화시켜가는 과정이라고 보면 됩니다. 반복이 모두 끝난 모습은 다음 그림과 같습니다.
이와 같이 SetData 메서드를 반복형 구문과 함께 사용하여 데이터 포인트들의 변화 과정을 순차적으로 확인할 수 있습니다. 다만 이렇게 눈으로만 확인하는 것 보다는 그 과정 자체를 결과물로 저장하는 것이 필요할 수 있는데요. 예를 들면 전체 과정을 동영상 비디오 파일로 저장하는 것이 가능합니다. 그 방법은 다음과 같습니다. 즉 앞서 제시된 반복형 구문에 몇가지 내용을 추가하는 것입니다.
sx = 600
sy = 500
vfile = 'setdata_video.mp4'
fps = 30
oVid = IDLffVideoWrite(vfile)
vidStream = oVid.AddVideoStream(sx, sy, fps)
FOR j = 0, 200 DO BEGIN
po.SetData, x[0:j], y[0:j]
cap = win.CopyWindow(WIDTH=sx)
time = oVid.Put(vidStream, cap)
ENDFOR
oVid.CleanUp
여기서 제시된 작업의 과정을 보면, 먼저 MP4 형식의 동영상 파일의 이름을 vfile이라는 변수로 정의하고 IDLffVideoWrite 함수를 사용하여 동영상 객체 oVid를 생성합니다. 그 다음에는 oVid 객체에 대하여 AddVideoStream 메서드를 사용하여 프레임 이미지의 가로/세로 크기(sx, sy) 및 초당 프레임수(fps)가 정의된 비디오 스트림 객체인 vidStream을 생성합니다. 그리고 이어지는 반복형 구문 내에서는 SetData 메서드에 의하여 변화되는 각 화면을 CopyWindow 메서드로 캡쳐하고 Put 메서드를 사용하여 캡쳐 화면을 비디오 스트림에 하나씩 추가하게 됩니다. 이런 식으로 모든 프레임들로 구성된 동영상이 생성되고, 반복이 종료된 후에는 CleanUp 메서드를 사용하여 파일을 닫아줘야 한다는 것까지만 유의하면 됩니다. 최종 생성된 MP4 동영상의 모습은 다음과 같습니다.
그리고 애니메이션 GIF 파일로 만드는 것도 가능합니다. 기본적인 흐름은 위의 내용과 유사하지만 저장될 파일이 GIF 형식이기 때문에 여기에 맞는 내용들로 대체되어야 합니다. 구체적인 과정은 다음과 같습니다.
gif_file = 'setdata_anim.gif'
FOR j = 0, 200 DO BEGIN
po.SetData, x[0:j], y[0:j]
cap = win.CopyWindow(WIDTH=600)
frame = COLOR_QUAN(cap, 1, r, g, b)
WRITE_GIF, gif_file, frame, r, g, b, /MULTIPLE, $
DELAY_TIME=10, REPEAT_COUNT=0
ENDFOR
WRITE_GIF, gif_file, /CLOSE
이 과정에 관한 자세한 내용은 제가 예전에 올렸던 관련게시물을 참조하시기 바랍니다. 최종 생성된 애니메이션 GIF 파일의 모습은 다음과 같습니다.
'IDL > New Graphics' 카테고리의 다른 글
구간이 불규칙한 불연속 컬러테이블 기반의 표출 (0) | 2022.06.24 |
---|---|
Scattered Bar Plot in 3D (?) (0) | 2022.06.10 |
_EXTRA 키워드의 활용 예제 (0) | 2022.04.28 |
컬러테이블만 표출하는 방법 (0) | 2022.04.19 |
그림에 한글 표시하기 (NG 체계) (0) | 2022.04.12 |