IDL/New Graphics

플롯(Plot)을 다중으로 중첩하여 표출하는 방법 (축까지 추가)

이상우_IDL 2015. 12. 14. 17:03
728x90

우리가 플롯(Plot)을 그리는데 있어서 여러 데이터를 하나의 XY축 공간상에 중첩하여 표출하는 경우가 많이 있습니다. NG 체계의 PLOT 함수를 기준으로 얘기하면, 플롯을 하나 먼저 그리고 그 다음 플롯을 그릴 때 OVERPLOT 키워드를 사용하는 방법이 대표적입니다. 가장 간편하게 이용될 수 있는 방법이기도 합니다. 그런데 이 방법의 단점이 있습니다. 각 데이터가 커버하는 값의 범위가 서로 확연히 다를 경우에는 하나의 데이터를 잘 표시하려다가 다른 데이터가 잘 안보이게 되는 문제인데요. 예를 한번 들어보겠습니다. 다음과 같이 X축상으로는 동일한 x라는 데이터가 있지만, 여기에 대응되는 두 종류의 y1, y2 데이터가 있는 경우입니다. y1의 경우 범위가 0~3.2 정도이지만, y2의 경우는 0~100이 됩니다. 먼저 y1만 그려보면 다음과 같습니다.


x = FINDGEN(101)/10

y1 = SQRT(x)

y2 = x^2

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

pl1 = PLOT(x, y1, YRANGE=[0, 5], YTITLE='Y1', XTITLE='X', $

  THICK=2, MARGIN=0.12, /CURRENT)



여기서는 y1의 범위에 최적화하기 위하여 Y축의 범위를 0~5로 설정하였습니다. 그리고 XY축 공간이 좌우상하로 갖게 되는 여백을 0.12로 설정하였습니다. 나중에 뭔가를 덧그릴 때 여유공간 확보를 위해서 미리 이렇게 해두었다고 보면 됩니다. 이번에는 y1 데이터를 먼저 표출한상태에서 같은 XY공간상에 y2 데이터를 중첩하는 경우를 보겠습니다. 통상적으로 많이 사용하는 OVERPLOT 키워드를 사용하는 방식으로 해보려면 다음과 같이 하면 되고, 그 결과는 다음 그림과 같습니다.


win = WINDOW(DIMENSIONS=[600500])

pl1 = PLOT(x, y1, COLOR='blue', YRANGE=[0, 5], AXIS_STYLE=1, $

  YCOLOR='blue', YTITLE='Y1', XTITLE='X', THICK=2, MARGIN=0.12, /CURRENT)

pl2 = PLOT(x, y2, COLOR='red', /OVERPLOT)



여기서는 y1, y2 두 데이터를 구분하기 좋게 하기 위하여 색상을 따로 설정하는 옵션을 추가하였습니다. 하여간 어느 정도 예상되었던 결과이지만 역시나 뭔가 문제가 있어 보입니다. 즉, y1을 제대로 표시하기 위하여 설정했던 Y축의 범위 0~5로는 y2를 제대로 보기가 힘들다는 것을 알 수 있습니다. 만약에 Y축 범위를 0~5로 설정하기 위하여 사용했던 YRANGE 키워드를 아예 사용하지 않을 경우에는, Y축의 범위가 y2의 범위에 맞춰져서 다음 그림과 같이 나오게 됩니다. 하지만 두 경우 모두 우리가 y1, y2 데이터를 온전하게 표출하는 바람직한 방법은 아닌 것 같습니다.



그렇다면 y1, y2를 하나의 XY공간상에서 둘 다 제대로 표출하려면 어떤 방법을 써야 할까요? 이 문제의 해결을 위해서는 가장 먼저 OVERPLOT의 사용을 포기해야만 합니다. 즉, x와 y1의 플롯을 그린 다음에 x와 y2의 플롯을 별도로 또 그려서 중첩되도록 하는 방법을 사용하는 것이 좋습니다. 다만 이렇게 두 종의 플롯을 OVERPLOT을 사용하지 않고 덧그리게 되면 각각의 XY축, 눈금 문자 등등이 모두 겹쳐서 나오게 됩니다. 하지만 이렇게 불필요하게 중첩되는 요소들을 피하고, 꼭 필요한 부분들만 서로 중첩되도록 하면서 두 플롯을 겹쳐서 그리는 것이 핵심입니다. 이 방법을 설명해보겠습니다. 먼저 x와 y1의 플롯을 다음과 같이 약간 특별한 방법으로표출하였습니다.


win = WINDOW(DIMENSIONS=[600500])

pl1 = PLOT(x, y1, COLOR='blue', YRANGE=[0, 5], AXIS_STYLE=1, $

  YCOLOR='blue', YTITLE='Y1', XTITLE='X', THICK=2, MARGIN=0.12, /CURRENT)



여기서는 PLOT 함수의 AXIS_STYLE이라는 키워드를 사용하였습니다. 원래 이 키워드의 기본값은 2인데, 바로 XY축을 박스형태로 그리는 옵션입니다. 그런데 이 키워드의 값을 1로 설정하면 위 그림과 같이 하단의 X축 및 좌측의 Y축만 표시하게 됩니다. 이 키워드에 관한 자세한 내용은 PLOT 함수에 관한 도움말에서 보면 됩니다. 굳이 이렇게 하는 이유는 나중에 오른쪽 부분에 별도의 Y축을 따로 추가하기 위하여 공간을 비워두기 위해서입니다. 그 다음 단계에서는 x와 y2의 플롯을 중첩해서 그려야 하는데요. 말 뜻 그대로 "덧그려야" 합니다. 즉 다음과 같이 독립적인 플롯을 같은 공간상에 하나 더 겹쳐 그리는 것입니다.


pl2 = PLOT(x, y2, COLOR='red', YRANGE=[0, 100], AXIS_STYLE=4, $

  THICK=2, MARGIN=0.12, /CURRENT)


단, 여기서 또 주목해야 할 것이 바로 앞서도 사용되었던 AXIS_STYLE 키워드인데요. 이번에는 이 키워드이 값을 4로 설정하였습니다. 이 경우에는 마치 XY축이 온전하게 있는 것처럼 그림을 그리긴 하지만, XY축 자체는 보여주지 않습니다. 즉, x와 y2의 플롯 궤적 자체만 덧그려진 상태이기 때문에 그 결과를 보면 다음 그림과 같이 나타나게 됩니다. 이 그림을 보면 y2 데이터에 대하여 Y축이 0~100의 범위가 되도록 그려져 있음을 알 수 있습니다.



물론 아직 다 끝난 것은 아니고 마지막 하나의 단계가 남아있습니다. 즉, y2 데이터에 해당되는 Y축을 오른쪽 부분에 표시해줘야 하는 작업인데요. 이 작업을 위해서는 AXIS라는 별도의 그래픽 함수를 사용해야 합니다. 이 함수의 역할은 말 그대로 "축"만 표출하는 역할이기 때문에 지금과 같은 상황에서 유용하게 사용될 수 있습니다. 여기서는 이 함수를 다음과 같이 사용하면 됩니다.


yaxis = AXIS('y', LOCATION=10, TICKDIR=1, TEXTPOS=1, TARGET=pl2, COLOR='red', TITLE='Y2')


이 AXIS 함수의 자세한 사용법 역시 도움말을 참조하면 되겠지만, 여기서 사용된 방식을 간단히 언급해보겠습니다. 첫번째이자 유일한 인자인 'y'는 어떤 축을 그릴 것인가를 나타내는 의미입니다. 그리고 그 뒤에는 전부 키워드들인데요. LOCATION은 이 Y축을 기존 플롯의 X축상의 어떤 값 위에 그릴 것인가를 X축상의 값으로 표시한 것입니다. 10이라면 X축상에서 오른쪽 끝부분에 해당되겠지요. 그리고 TARGET 키워드는 이 Y축이 결국 기존의 어느 플롯에 해당되는 개체가 되어야 할 것인가를 나타내는 것인데, 여기서는 앞서 y2 데이터 표출을 위하여 그렸던 플롯의 이름인 pl2가 되어야 합니다. 그 외에 TICKDIR, TEXTPOS 키워드들은 이 Y축의 눈금의 방향및 축 타이틀 문자의 위치를 설정하는 역할입니다. 이와 같이 하면 그 결과는 다음 그림과 같습니다.



여기서는 의도적으로 y1 플롯 및 축을 파란색으로 그리고 y2 플롯 및 축을 붉은색으로 설정하였습니다. 어쨌든 범위가 서로 확연히 다른 여러 종류의 플롯을 중첩하여 표출하는 방법의 기본은 이와 같습니다. 물론 두 개 이상의 플롯들을 덧그려야 하는 경우도 있을텐데, 그 경우에는 플롯선 자체는 계속 중첩하여 표출하면서도 추가되어야 할 축들의 위치를 잘 조정해서 서로 겹치지 않고 보기 좋도록 세부 설정을 좀 더 신경써서 해주면 됩니다.

LIST