IDL/New Graphics

다수의 그림들에 대한 OVERPLOT 및 TARGET의 활용법

이상우_idl 2024. 3. 12. 14:53
728x90
반응형

IDL에서 그림을 표출해놓은 상태에서 그 위에 추가 요소를 중첩해야 하는 경우들이 종종 있습니다. 예를 들어 플롯(Plot) 그림을 표출한 상태에서 추가로 새로운 데이터를 중첩하려면 /OVERPLOT 키워드를 사용하면 됩니다. 그리고 이미 표출된 그림 위에 문자, 기호 등을 추가하는 것도 얼마든지 가능합니다. 그런데 한꺼번에 여러 개의 그림들이 표출된 상태에서 특정한 그림에 대하여 뭔가를 더 추가해야하는 경우가 있습니다. 오늘은 그러한 경우의 적절한 처리 방법에 관하여 소개해보고자 합니다. 본격적인 설명을 위하여 하나의 그래픽창에 3종의 그림들이 한꺼번에 표출되는 상황을 예로 들어보겠습니다. 먼저 예제 데이터의 생성 및 기본적인 표출 과정은 다음과 같습니다.

 

x = FINDGEN(361)
y1 = SIN(x*!DTOR)
y2 = COS(x*!DTOR)
y3 = x^0.2
y4 = SIN(2*x*!DTOR)
win = WINDOW(DIMENSIONS=[1000, 400], /NO_TOOLBAR)
p1 = PLOT(x, y1, XRANGE=[0, 360], MARGIN=0.1, FONT_SIZE=10, $
  /CURRENT, LAYOUT=[3, 1, 1])
p2 = PLOT(x, y2, XRANGE=[0, 360], MARGIN=0.1, FONT_SIZE=10, $
  /CURRENT, LAYOUT=[3, 1, 2])
p3 = PLOT(x, y3, XRANGE=[0, 360], MARGIN=0.1, FONT_SIZE=10, $
  /CURRENT, LAYOUT=[3, 1, 3])

 

여기서는 3종의 플롯들(y1, y2, y3)이 가로 방향으로 나란히 표출되도록 하였습니다. 참고로 NG 체계에서 하나의 그래픽창 내에 여러 그림들을 구획별로 표출하기 위해서는 이와 같이 LAYOUT 속성을 사용하면 되며 그 방법에 관한 자세한 내용은 관련 게시물을 참조하시면 됩니다. 어쨌든 위의 내용을 실행하면 결과는 다음 그림과 같습니다.

 

 

그러면 여기서 네번째 데이터인 y4에 대한 플롯을 추가로 중첩하기 위하여 다음과 같이 PLOT 함수와 /OVERPLOT 키워드를 사용해봅시다.

 

p4 = PLOT(x, y4, COLOR='red', /OVERPLOT)

 

이와 같이 이미 3종의 그림들이 표출되어 있는 상태에서 또 다른 플롯을 중첩하도록 하면 결과는 다음과 같습니다.

 

 

이 결과를 보면 추가 데이터가 중첩된 대상이 세번째 플롯인 p3임을 알 수 있습니다. 그 이유는 /OVERPLOT 키워드에 의한 중첩에 있어서는 가장 최근에 표출된 그림이 중첩의 대상이 되는 것이 디폴트이기 때문입니다. 그러면 만약 중첩의 대상을 다른 그림으로 하려면 어떻게 하면 될까요? 즉 첫번째 또는 두번째 그림을 중첩의 대상으로 하고 싶은 경우입니다. 그럴 경우에는 중첩의 대상이 될 플롯 개체에 대하여 Select 메서드를 사용하는 것이 필요합니다. 예를 들어서 첫번째 플롯을 중첩의 대상으로 하고 싶다면 다음과 같이 처리하면 됩니다.

 

p1.Select
p4 = PLOT(x, y4, COLOR='red', /OVERPLOT)

 

이와 같이 첫번째 플롯 개체인 p1에 대하여 Select 메서드를 사용함으로써 중첩의 대상이 p1이 되도록 설정한 후에 추가 데이터를 중첩하면 됩니다. 그 결과는 다음과 같습니다.

 

 

이와 같이 /OVERPLOT 키워드에 의한 중첩의 대상은 기본적으로는 가장 최근에 표출된 그림 개체가 되지만, Select 메서드를 활용함으로써 그 대상을 따로 지정할 수 있다는 것을 염두에 두면 됩니다. 그리고 또 다른 방법으로는 대상이 될 그래픽 개체 이름을 OVERPLOT 키워드에 인수로 부여하는 방법도 있습니다. 즉 다음과 같이 처리하는 것입니다.

 

p4 = PLOT(x, y4, COLOR='red', OVERPLOT=p1)

 

이렇게 해도 앞서 Select 메서드를 사용할 경우와 효과는 동일합니다. 아마도 OVERPLOT 키워드는 일종의 on/off 개념처럼 /OVERPLOT과 같은 형태로 사용되는 경우가 일반적이긴 하지만, 위와 같이 중첩의 대상이 될 그래픽 개체 이름을 인수로 부여함으로써 그 대상을 직접 지정하는 효과를 얻을 수도 있다는 것을 참조해두시면 좋을 것 같습니다.

 

그리고 이와 같이 OVERPLOT 키워드로 추가 데이터를 중첩하는 경우 외에도 문자, 기호 등과 같은 annotation에 해당되는 요소들을 그림 내에 추가해야 하는 경우도 있습니다. 예를 들어 데이터 좌표계 기준으로 특정한 위치에 문자 및 선(Line)을 삽입하기 위하여 다음과 같은 내용을 추가적으로 실행해봅시다.

 

tx = TEXT(250, 0.8, 'Test', COLOR='green', FONT_SIZE=12, /DATA)
line = POLYLINE([0, 360], [0, 0], THICK=2, LINESTYLE=2, COLOR='blue', /DATA)

 

그 결과는 다음 그림과 같습니다.

 

 

이 그림을 보면 추가된 요소들이 모두 첫번째 플롯 내에 삽입되었음을 확인할 수 있습니다. 왜인지는 모르겠지만 기본적으로는 이렇게 처리되는 것 같습니다. 여기서도 만약 그 대상이 될 플롯을 내가 직접 지정하고 싶다면 어떻게 해야 할까요? 그러기 위해서는 바로 TARGET 속성을 활용하면 됩니다. 즉 다음과 같이 대상이 될 플롯 개체를 TARGET 속성에 지정하여 위의 내용을 다음과 같이 수정하면 됩니다.

 

tx = TEXT(250, 0.8, 'Test', COLOR='green', FONT_SIZE=12, /DATA, TARGET=p3)
line = POLYLINE([0, 360], [0, 0], THICK=2, LINESTYLE=2, COLOR='blue', /DATA, TARGET=p2)

 

이러한 수정사항을 반영하여 다시 실행해보면 결과는 다음과 같습니다.

 

 

정리를 해본다면 /OVERPLOT 키워드를 사용하여 추가 데이터를 중첩하는데 있어서 그 대상이 될 그래픽 개체를 지정하기 위해서는 Select 메서드를 사용하면 되고, 각종 annotation 요소들을 추가하는데 있어서 그 대상이 될 그래픽 개체를 지정하기 위해서는 TARGET 속성을 사용하면 된다는 것을 알아두시면 됩니다. 그리고 이와 같이 /OVERPLOT 키워드의 적용 대상을 지정하거나 TARGET 속성을 사용하는 방법은 그림들이 단일 그래픽창에 다 함께 존재하는 경우뿐 아니라 그냥 각자 별개의 그래픽창에 표출된 경우에도 동일하게 적용됩니다. 즉 앞서 초반부에서 3종의 데이터들(y1, y2, y3)을 p1, p2, p3라는 플롯들로 표출하는 과정을 다음과 같이 변경하여 처리해봅시다.

 

win1 = WINDOW(DIMENSIONS=[600, 400], /NO_TOOLBAR)
p1 = PLOT(x, y1, XRANGE=[0, 360], MARGIN=0.1, FONT_SIZE=10, $
  TITLE='Plot 1', /CURRENT)
win2 = WINDOW(DIMENSIONS=[600, 400], /NO_TOOLBAR)
p2 = PLOT(x, y2, XRANGE=[0, 360], MARGIN=0.1, FONT_SIZE=10, $
  TITLE='Plot 2', /CURRENT)
win3 = WINDOW(DIMENSIONS=[600, 400], /NO_TOOLBAR)
p3 = PLOT(x, y3, XRANGE=[0, 360], MARGIN=0.1, FONT_SIZE=10, $
  TITLE='Plot 3', /CURRENT)

 

이와 같이 3종의 플롯들이 각자 따로 그래픽창에 표출될 것입니다. 이러한 상황에서 그 이후의 중첩 과정들 즉 y4 데이터에 대한 p4 플롯을 중첩하는 과정 및 문자와 선을 추가로 삽입하는 과정까지 동일하게 진행해보면 결과는 다음과 같습니다.

 

 

이와 같이 플롯들이 각자 별개의 그래픽창에 존재하는 상태이지만, 중첩의 결과는 동일하다는 것을 확인할 수 있습니다. 어쨌든 다수의 그림들이 표출된 상태에서 추가적인 요소들을 중첩 또는 삽입하는데 있어서 그 대상을 직접 지정하려면 이러한 요령으로 작업하면 됩니다. 그리고 이러한 원리는 플롯(Plot) 뿐 아니라 등위선(Contour), 이미지(Image) 등과 같은 다른 종류의 그림들에 대해서도 동일하게 적용된다는 것도 참조해두시기 바랍니다.

반응형