오늘은 플롯(Plot)을 그린 상태에서 그 위에 이미지를 중첩하는 방법을 알아보기로 하겠습니다. 즉, XY축으로 이루어진 공간상에 이미지를 중첩하여 표출하는 방법에 관한 내용입니다. 예전에 NG 체계가 없던 시절에는 DG 체계에서 이러한 작업을 해야 했었는데, 그 방법이 좀 까다로운 편이었습니다. 그런데 DG 체계에서 이러한 작업을 비교적 간단하게 할 수 있게 해주는 루틴이 있었는데, 바로Fanning 라이브러리에 있는 TVIMAGE였습니다. 저도 예전에 자주 애용했던 기억이 납니다. 따라서 DG 체계에서는 그냥 이거 사용하면 된다고 언급하면 사실 끝납니다. 하지만 오늘 소개해드릴 내용은 NG 체계에서의 방법입니다. 얼핏 생각하면 NG 체계에서는 이게 더 간단하게 잘 될 것 같이 보일 수도 있는데, 실제로는 약간 신경써야 할 부분이 좀 있습니다.
설명을 위하여 다음과 같은 x, y 데이터를 사용하여 먼저 예제 플롯을 하나 그려 봅시다. 그러면 다음과 같은 그림이 그려집니다.
img = HANNING(300, 300)
x = [-10:10:0.1]
y = x^2
win = WINDOW(DIMENSIONS=[600, 500])
pl = PLOT(x, y, COLOR='blue', THICK=2, /CURRENT)
이 그림을 보면 플롯의 X축의 범위는 -10~+10이고 Y축 범위는 0~100이 됩니다. 이제 다음과 같은 2차원 이미지 데이터를 가상으로 생성하여, 이미 그려진 플롯상의 XY축 공간상에 꽉 차도록 이미지를 중첩하여 표출해보려고 합니다. 일단 이미지의 표출을 위해서는 IMAGE 함수를 사용해야 하겠지만, 플롯상에 중첩을 해야 하므로 다음과 같이 OVERPLOT 키워드를 사용해보기로 합니다.
im = IMAGE(img, RGB_TABLE=72, /OVERPLOT)
제대로 된 방법은 아닐 것 같긴 한데 어쨌든 이렇게 해보면 결과는 다음 그림과 같습니다.
우려했던 대로 역시나 우리가 원하던 결과는 아닙니다. 이미지가 꽉 차게 들어가 있지도 않고, 더구나 플롯 자체의 X축 및 Y축의 범위도 이상하게 변해 있습니다. 이렇게 된 원인은, 중첩될 이미지의 크기가 300X300인데 XY 각 방향의 범위가 0~300인 것처럼 해석이 된 상태로 플롯상에 중첩이 되었기 때문입니다. 그러면서, 중첩이 된 이미지가 억지로 기존의 플롯의 공간을 제멋대로 변형시켜버린 상황이 되어버렸습니다.
그래서 이러한 방식 대신 다음과 같이 IMAGE_LOCATION 및 IMAGE_DIMENSIONS라는 키워드들을 추가적으로 사용해야 합니다. 여기서 IMAGE_LOCATION에 대해서는 플롯 공간상에서 이미지의 왼쪽 하단 구석 부분이 위치할 좌표가 주어져야 하고, IMAGE_DIMENSIONS에 대해서는 플롯 공간상에서 이미지가 차지할 크기가 주어져야 합니다. 단, 이 값들은 모두 플롯 공간상의 좌표계를 기준으로 한 값이 되어야 합니다. 따라서 각 키워드별로 다음과 같이 [-10, 0] 및 [20, 100]이 주어졌습니다.
im = IMAGE(img, RGB_TABLE=72, IMAGE_LOCATION=[-10, 0], IMAGE_DIMENSIONS=[20, 100], $
ASPECT_RATIO=0, /OVERPLOT)
그리고 하나 더 중요한 키워드가 바로 ASPECT_RATIO인데요. 이 키워드에 대하여 0이란 값이 부여되어 있습니다. 만약 이 키워드를 사용하지 않을 경우에는, 이미지의 크기인 [20, 100]에 맞는 가로/세로 비율로 이미지를 표출하게 됩니다. 즉 세로로 길쭉한 모습으로 이미지가 나오면서 플롯의 축들도 거기에 맞춰서 중첩이 되므로, 이 역시 우리가 원하던 모습과는 맞지 않게 됩니다(여러분이 직접 한번 테스트해보시기 바랍니다). 이러한 점들을 유의하면서 위와 같이 실행하면 그 결과는 다음 그림과 같습니다.
이 그림을 보면 이미지가 플롯상에 꽉 차게 들어가 있어서 성공한 것 같긴 한데, 사실 자세히 보면 원래 있던 파란색의 플롯선이 보이지 않습니다. 중첩된 이미지가 덮어버렸기 때문입니다. 따라서 이 선이 다시 보이도록 해줘야 합니다. 이 작업은 PLOT 함수로 생성되어 있던 플롯 개체에 대하여 Order라는 메서드를 다음과 같이 사용하면 바로 해결됩니다. 여기서 사용된 SEND_TO_BACK이란 키워드의 의미는 말 그대로 해당 개체를 맨 뒤쪽으로 후퇴시키라는의미입니다. 마치 우리가 파워포인트나 키노트에서 중첩된 그림들을 선택적으로 전면 또는 후면에 배치하는 것과 비슷한 느낌으로 이해하면 됩니다. NG 체계에서는 생성되어 있는 그래픽 개체들에 대하여 이렇게 시각적인 우선순위를 제어하는 것이 가능합니다. 어쨌든 이렇게 하면 다음 그림과 같은 결과를 얻게 됩니다.
im.Order, /SEND_TO_BACK
이 정도면 아마 우리가 원하던 결과가 나온 것 같습니다. 즉 중첩된 이미지가 마치 플롯의 배경 이미지인 것처럼 사용이 된 모습입니다. 만약 배경 이미지를 약간 흐릿하게 보이도록 하고 싶다면, 투명도에 해당되는 TRANSPARENCY라는 속성을 설정하면 됩니다. 예를 들어 다음과 같은 명령을 추가적으로 실행하면, 다음 그림과 같이 이미지의 투명도가 30%가 되도록 처리되는 효과를 얻을 수 있습니다.
im.TRANSPARENCY = 30
참고로 이러한 속성 설정은 애초에 IMAGE 함수를 사용할 때 키워드의 형태로 해도 되고, 지금처럼 차후 변경하는 방식으로 해도 됩니다. NG 체계의 고유한 특성이라고 볼 수 있습니다.
지금까지, NG 체계에서 플롯상에 이미지를 중첩하는 방법을 소개해보았습니다. 이 방법은 XY축 기반으로 이루어지는 다른 종류의 그림들(CONTOUR, BARPLOT, SCATTERPLOT 등)에 대해서도 공통적으로 적용되므로, 잘 알아두면 좋은 팁이 될 것이라 생각합니다.
'IDL > New Graphics' 카테고리의 다른 글
CLIP 속성의 이해와 응용 [1] (0) | 2016.01.29 |
---|---|
Animation GIF의 제작 예제 (NG 기반) (0) | 2016.01.25 |
에러바(Error Bar)의 표출 (0) | 2015.12.17 |
플롯(Plot)을 다중으로 중첩하여 표출하는 방법 (축까지 추가) (0) | 2015.12.14 |
NG 그래픽 함수의 주요 메서드(Method) 사용법 [2] (0) | 2015.11.30 |