IDL/New Graphics

NG 그래픽 함수의 주요 메서드(Method) 사용법 [1]

이상우_IDL 2015. 11. 20. 17:37
728x90

NG 체계의 그래픽 함수들을 사용하여 그림을 그리는데 있어서 가장 기본적으로는 개별 그래픽 함수의 사용법을 아는 것이 중요합니다. 물론 제가 이 블로그에서 여러 차례 다양한 예제들을 통하여 소개를 드린 바 있는데요. 오늘은 메서드(Method)라는 것의 사용법에 관한 얘기를 해보겠습니다. 용어 때문에 좀 겁이 나는 부분도 있긴 하지만 별 대단한 것은 아닙니다. 속성(Property)이라는 것이 그래픽 개체의 세부 특성을 결정하기 위한 일종의 키워드(Keyword)와 같은 역할이라고 한다면, 메서드는 그래픽 개체에 대한 다양한 방식의 제어를 위한 명령같은 것이라고 보면 됩니다. 예를 들어 NG 체계에서 플롯 그릴 때 사용하는 PLOT 함수에 관한 자세한 내용을 도움말에서 찾아보면, Methods라는 섹션에 여러가지 항목들이 보입니다. Close, Delete, Save 등 거의 20여개에 이르는 다양한 메서드들이 지원되고 있음을 확인할 수 있는데요. 오늘은 이들 중 알아두면 좋을만한 몇 개만 골라서 언급해보기로 하겠습니다. 먼저 예제로 플롯을 다음과 같이 그려봅시다.


win = WINDOW(DIMENSIONS=[600, 500])

x = FINDGEN(361)

y = SIN(x*!DTOR)

pl = PLOT(x, y, XRANGE=[0, 360], XMAJOR=5, COLOR='blue', THICK=2, /CURRENT)


여기서는 WINDOW 함수로 적당한 크기의 그래픽창을 띄우고, 플롯으로 그릴 x, y 데이터를 설정한 후 PLOT 함수를 사용하였습니다. 그 결과는 다음 그림과 같습니다.



가장 먼저 Delete라는 메서드를 사용해보겠습니다. 우리가 메서드를 사용할 때에는 항상 그래픽 개체의 이름 뒤에 점(.)을 찍고 메서드 이름을 적습니다. 그리고 그 뒤에 필요인자들을 적는 방식입니다. 여기서는 다음과 같이 하면 됩니다.


pl.Delete


이 Delete 메서드의 역할이 무엇인지는 그 결과 그림을 보면 알 수 있습니다. 다음 그림과 같습니다.



아마 이 그림을 보면 그 역할이 짐작이 될 것 같은데요. 바로 플롯 개체만 없애는 역할입니다. 여기서 말하는 플롯 개체는 XY축을 제외한 실제 xy 데이터에 해당되는 부분을 의미합니다. 따라서 XY축은 그대로 남습니다. 이 상태에서 다음과 같이 새로운 y 데이터를 정의하고 OVERPLOT 옵션을 사용하여 덧그리면, 기존의 XY축 공간을 그대로 사용하여 새로운 데이터만 그려지게 됩니다.


y = COS(x*!DTOR)

pl = PLOT(x, y, COLOR='red', THICK=2, /OVERPLOT)



이번에는 Erase라는 메서드를 사용해보겠습니다. 위의 상태에서 다음과 같이 해봅시다. 그러면 그 결과는 다음 그림과 같습니다.


pl.Erase



즉, Erase 메서드는 PLOT 함수로 생성된 개체 전체, 즉 데이터 뿐 아니라 XY축까지도 다 지워버리는 역할을 합니다. 따라서 맨 처음에 WINDOW 함수로 그래픽창만 만들어놓았던 그 상태로 되돌아간다고 보면 됩니다. 그래픽 개체의 모든 요소들을 그야말로 지워버리는 역할이라고 보면 됩니다. 하지만 메서드 하나 더 설명해야 할 것이 남아있기 때문에, 처음에 그렸던 사인 곡선은 다음과 같이 다시 그려놓겠습니다.


pl = PLOT(x, y, XRANGE=[0, 360], XMAJOR=5, COLOR='blue', THICK=2, /CURRENT)


이번에 소개할 메서드는 Close입니다. 다음과 같이 사용해봅시다.


pl.Close


이렇게 하면 어떤 일이 벌어질까요? 해보시면 아시겠지만, 그래픽창 자체가 그냥 사라져버립니다. 이게 조금 의아할 수 있는 부분이, Close 메서드는 플롯 개체인 pl에 사용하였지만 그래도 그래픽창이 완전히 제거된다는 점입니다. 사실 이 메서드는  WINDOW 함수로 만들었던 win에 대하여 적용해도 결과는 같습니다. 만약에 하나의 그래픽창에 여러 개의 그래픽 개체들이 동시에 존재할 경우, 그 중 하나의 그래픽 개체에 대하여 Close 메서드를 사용해도, 그래픽창 자체가 제거되면서 그 위에 그려져있던 다른 개체들도 함께 제거된다는 점을 유의해야 합니다.


오늘 소개한 Delete, Erase, Close 메서드들은 결국 그래픽 개체의 제거와 관련하여 어떤 요소들이 그 대상이 되느냐의 차이가 있다고 보면 됩니다. 사실 NG 체계에서 그래픽 개체는 하나하나가 메모리(Memory)를 점유합니다. DG 체계와는 확연히 구분되는 요소인데요. 그렇게 때문에 주의가 필요할 경우가 있습니다. 예를 들어, 유사한 종류의 데이터가 여러 개가 존재하는 상황에서 각 데이터별 그림을 그리는 작업을 반복문을 사용하여 수행하는 경우가 있는데요. 여기서 그림 그리는 작업이 NG 체계에서 진행될 경우에는각 반복회차별 작업에서 그림 개체의 생성 뿐 아니라 제거에 있어서도 신경을 써야 합니다.


예를 들어, 다음과 같이 반복문내에서 PLOT 함수를 사용하여 그림을 생성하는 명령만 존재할 경우에는 그래픽창 100개가 뜨는 상당히 난감한 상황을 맞을 수 밖에 없습니다.


FOR i = 0, 99 DO BEGIN

  win = WINDOW(~~)

  pl = PLOT(~~)

ENDFOR


그렇다면 이러한 상황이 벌어지지 않도록 하려면 어떻게 해야 할까요? 위에서 소개한 메서드들을 적당히 활용하면 됩니다. Delete나Erase를 사용하여 플롯 개체를 제거하는 방법도 있을 수 있고, Close 메서드를 사용하여 그래픽창 단위에서 제거한 후 다음 회차에 그래픽창부터 다시 생성되도록 하는 방법도 있을 수 있습니다. 예를 들어 다음과 같이 플롯을 생성한 후 필요한 작업들을 수행한 다음에는 완전히 제거되도록 하는 일련의 과정들이 반복되도록 하면 그래픽창 100개가 한꺼번에 뜨는 난감한 상황은 피할 수가 있을 것입니다.


FOR i = 0, 99 DO BEGIN

  win = WINDOW(~~)

  pl = PLOT(~~)

  win.Close

ENDFOR


사실 100개의 그래픽창이 한꺼번에 떠있게 되면, 그만큼 메모리를 더 점유하게 되므로 전체적인 퍼포먼스에도 부정적인 영향을 줄 수 밖에 없습니다. 따라서 상황에 맞게 위의 메서드들을 적절히 활용하는 것이 중요합니다. 이러한 메서드들은 PLOT뿐 아니라 NG 체계의 다른 그래픽 함수들에서도 거의 대부분 공통적으로 존재한다는 점 참조해두시면 좋겠습니다.


제가 이 게시물의 제목에 [1]이라는 숫자를 붙여놓았습니다. 다른 알아둘만한 메서드들에 대해서도 기회가 되는대로 후속 게시물을 이어나갈 생각입니다.

LIST