IDL/New Graphics

CLIP 속성의 이해와 응용 [2]

이상우_idl 2020. 4. 16. 11:55
728x90
반응형

오늘은 NG 체계에서 그래픽 표출에 있어서 CLIP 속성에 알아보고자 합니다. 사실 CLIP 속성에 관해서는 제가 예전에 관련 게시물을 올린 적이 있습니다. 그래서 그 내용과 약간 겹치는 부분도 있겠지만 당시 미처 언급하지 못했던 특성들 및 관련 예제를 오늘 이어서 소개하고자 합니다. 그러면 먼저 예제 데이터에 대한 정의 및 기본적인 표출부터 먼저 해봅시다. 내용은 다음과 같습니다.

 

x = FINDGEN(361)

y = COS(8*x*!dtor)*EXP(-x/400.)

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

pl = PLOT(x, y, XRANGE=[0, 360], XTICKINTERVAL=90, $

  COLOR='crimson', FONT_SIZE=11, THICK=2, $

  YRANGE=[-0.7, 1], /CURRENT)

 

이 내용을 실행하면 다음과 같은 그림이 표출됩니다.

 

 

 

이 그림을 보면 하단 부분이 잘린 것처럼 보입니다. 실제로 잘린 것이 맞습니다. 왜냐하면 Y축의 범위를 의도적으로 -0.7~+1로 설정하였는데, 이 데이터의 Y축 방향 범위의 하단 부분은 거의 -1에 근접하기 때문입니다. 데이터의 전체 모습이 온전하게 보이도록 하려면 Y축의 범위를 조정하는 것이 가장 바람직하겠지만, 오늘의 메인 주제는 CLIP 속성이므로 여기에 촛점을 맞추겠습니다. CLIP 속성에 대한 기본적인 내용은 앞서 언급한 이전 게시물에서 언급했으므로, 여기서는 반복해서 언급하지는 않겠습니다. 그러면 위의 예제 코드에서 다음과 같이 CLIP 속성을 추가한 다음 다시 실행해봅시다.

 

x = FINDGEN(361)

y = COS(8*x*!dtor)*EXP(-x/400.)

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

pl = PLOT(x, y, XRANGE=[0, 360], XTICKINTERVAL=90, $

  COLOR='crimson', FONT_SIZE=11, THICK=2, $

  YRANGE=[-0.7, 1], CLIP=0, /CURRENT)

 

그러면 다음과 같은 그림이 표출될 것입니다.

 

 

 

첫 그림에서는 Y축의 범위에 의하여 보이지 않았던 하단 부분이 이제 보입니다. 앞서 언급한 예전 관련 게시물에서도 비슷한 예제를 소개한 바 있기 때문에, 여기까지는 별로 새로운 내용은 아닙니다. 그런데 오늘 제가 추가로 언급하고자 하는 것은 이러한 그림에 추가적인 요소들을 가미할 경우입니다. 흔히 annotation이라고 하는 것들로서 문자, 선, 도형 등을 추가할 경우인데요. 이런 경우에도 CLIP 속성에 대한 고려가 필요합니다. 예를 들어서 다음과 같이 TEXT 함수를 사용하여 캡션문자들을 추가해 봅시다.

 

tx1 = TEXT(270, 0.8, 'Letter 1', COLOR='blue', /DATA)

 

tx2 = TEXT(270, 1.1, 'Letter 2', COLOR='blue', /DATA)

 

여기서는 두개의 캡션문자들을 추가하였는데요. 첫번째 문자의 경우는 위치 좌표를 (270, 0.8)로 지정했고 두번째 문자는 (270, 1.1)로 지정하였습니다. 이 좌표들은 Data 좌표계입니다. 즉 플롯에서 정의된 X축 및 Y축의 범위값을 기반으로 정의된 좌표들입니다. 일단 이 내용을 실행해보면 결과는 다음 그림과 같습니다.

 

 

 

그런데 분명히 문자 두개를 추가 표출하였는데 실제로 눈으로 보이는 것은 'Letter 1' 하나뿐입니다. 'Letter 2'는 어디에도 보이지 않습니다. 그 이유는 두번째 문자의 경우는 Y좌표가 1.1로 설정되어 있는데, 이 값은 Y축 범위의 상한값인 1보다 바깥쪽이기 때문입니다. 그렇다면 이 두번째 문자도 잘 보이도록 하려면 어떻게 해야 할까요? 원리는 같습니다. 바로 CLIP 속성을 이용하는 것입니다. 위의 내용을 다음과 같이 수정하여 다시 한번 실행해 봅시다.

 

tx1 = TEXT(270, 0.8, 'Letter 1', COLOR='blue', /DATA)

 

tx2 = TEXT(270, 1.1, 'Letter 2', COLOR='blue', CLIP=0, /DATA)

 

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

 

 

 

이제는 두 문자가 모두 잘 보이는 것을 확인할 수 있습니다. 이러한 원리는 문자 뿐 아니라 선이나 도형에도 마찬가지로 적용됩니다. 예를 들어서 다음과 같이 POLYLINE 함수를 이용하여 선을 추가 표출해 봅시다.

 

line = POLYLINE([-30, 390], [-0.4, 0.6], COLOR='green', $

 

  THICK=2, /DATA)

 

여기서 선의 시작점의 좌표는 (-30, 0.4)이고 끝점의 좌표는 (390, 0.6)입니다. 물론 이 좌표값들 모두 Data 좌표계 기준입니다. 좌표값들을 보면 이 선이 XY 공간의 외곽 부분까지도 뻗어나갈 것임을 짐작할 수 있습니다. 하지만 위의 내용을 실행하여 실제로 표출된 모습은 다음 그림과 같습니다.

 

 

 

이와 같이 선 자체는 XY 공간을 전혀 벗어나지 않았습니다. 이미 정해진 X, Y축의 범위를 벗어나는 부분을 잘리는 것입니다. 왜 그런지는 아마 이제는 충분히 짐작이 가능하실 것입니다. 그리고 선의 모습이 온전하게 보이도록 하려면 역시 CLIP 속성의 사용이 필요하다는 것도 이제는 당연히 짐작하실 것입니다. 위의 내용을 다음과 같이 수정하여 실행해 봅시다.

 

line = POLYLINE([-30, 390], [-0.4, 0.6], COLOR='green', $

 

  THICK=2, CLIP=0, /DATA)

 

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

 

 

 

이와 같이 CLIP 속성을 활용하면 XY 공간을 벗어나는 부분도 제대로 표시되도록 할 수 있습니다. 이미 예전 게시물에서도 언급을 했듯이 CLIP 속성의 디폴트 값은 1입니다. 즉 XY 공간을 벗어나는 부분을 안보여주는 것이 디폴트 설정입니다. 따라서 XY축 공간을 벗어나는 부분에서도 보이도록 하려면 CLIP 속성의 값을 1로 설정하는 내용을 직접 추가해줘야 한다는 것을 유념해야 합니다.

 

아마도 여러분들 중에서는 위와 같이 XY축을 기반으로 한 그림을 표출하는 경우 그리고 그 상태에서 추가적인 요소들을 표출할 때, 분명히 실행도 제대로 되고 에러도 안나오는데 막상 눈으로는 보이지 않는 현상을 종종 겪으셨을지도 모르겠습니다. 저도 실전에서 그런 경험들이 적지않게 있었는데요. 그 때마다 비밀은 바로 CLIP 속성에 숨어있었습니다. 따라서 NG 체계에서의 그래픽 표출 작업에서 내가 분명히 표출하도록 했는데도 실제로는 보이지 않는 현상이 나타난다면 일단은 CLIP 속성에 대한 설정이 어떻게 되어있는지를 살펴보는 을 권장합니다.

 

그리고 CLIP 속성의 사용과 관련하여 한가지 또 유념해야 할 것이 있습니다. 특히 추가적인 annotation들을 표시할 경우에 해당되는 문제인데요. 추가 요소의 좌표값이 Data 좌표계 기반일 경우에만 CLIP 속성이 의미가 있다는 것을 유의해야 합니다. 만약 Data 좌표계가 아니라 Device, Normal 좌표계 기반으로 좌표값을 설정할 경우에는 CLIP 속성과는 무관해집니다. 예를 들어서 다음과 같이 선을 표출할 때 좌표값들을 Normal 좌표계 기반으로 설정해 봅시다.

 

line = POLYLINE([0.05, 0.95], [0.7, 0.3], COLOR='violet', $

 

  THICK=2, /NORMAL)

 

여기서는 분명히 CLIP 속성을 전혀 사용하지 않았습니다. 하지만 표출되는 그림의 모습은 다음과 같습니다.

 

 

 

이와 같이 선의 범위가 플롯 그림의 X, Y축 범위를 벗어나는데도 불구하고, CLIP 속성에 대한 설정 없이 온전하게 표출이 됩니다. 따라서 Data가 아닌 Device 또는 Normal 좌표계 기반일 경우에는 CLIP 속성의 사용이 필요없다는 점을 염두에 두시기 바랍니다.

 

오늘은 여기까지입니다. 혹시라도 CLIP 속성과 관련하여 또 다른 소재가 생긴다면 나중에 이어서 다뤄보기로 하겠습니다.

반응형