오늘은 NG 체계에서 다중 플롯을 그리는 방법을 소개해보고자 합니다. 분량을 고려하면 아마 2회 정도에 나눠서 올려야 할 것 같습니다. 다중 플롯이라는 의미는 하나의 그래픽창에 여러 개의 플롯들을 구획을 나눠서 그리는 것을 말합니다. IDL을 오래전부터 사용해오셨던 유저들이라면 아마 기존의 DG 체계에서 이러한 작업을 하기 위하여 항상 !p.multi라는 시스템 변수를 설정했던 것을 기억하실 것 같습니다. 그런데 이런 원론적인 방법말고도 좀 더 편리하게 다중 플롯을 그릴 수 있도록 해주는 Multiplot이라는 명령을 사용해보신 분들도 있으리라 짐작됩니다. 사실 이 Multiplot은 IDL에 내장된 것이 아니고 IDL Astro 라이브러리에 있었던 것인데, 예전에는 다중 플롯의 구현을 위하여 유저들 사이에서 자주 애용되었던 것이라서, 어떤 분들은 이게 IDL에 기본 내장된 명령인 것으로 알고 계신 경우들도 꽤 있었습니다.
그런데 이번에 다룰 주제에서는 DG가 아닌 NG 체계에서의 다중 플롯의 구현 방법에 촛점을 맞춰보고자 합니다. 따라서 기본적으로는 PLOT 함수를 사용하게 될텐데, 이러한 작업을 위하여 필수적으로 알아두는 것이 좋은 PLOT 함수의 속성들이 세가지 있습니다. 바로 LAYOUT, MARGIN, POSITION입니다. 일단 오늘 소개할 첫 내용에서는 LAYOUT, MARGIN 두가지를 사용한 방법부터 소개해보기로 하겠습니다. 우선 이 두 속성들에 대한 기본적인 이해를 위하여 다음과 같은 두 개의 그림들을 좀 준비해 보았습니다.
이 그림에서 볼 수 있듯이, LAYOUT은 그래픽창내에서 구획을 어떻게 나눌 것인가를 먼저 정의하고 어느 섹터에 그림을 그릴 것인가도 지정할 수 있습니다. 다음과 같이 동일한 x 값들에 대하여 예제로 생성해본 네 종류의 y 값들에 대한 각 플롯을 LAYOUT 속성을 사용하여 2X2 구획에 그려봅시다. 여기서 생성한 y1~y4는 모두 대략 0~1의 범위를 갖도록 하였습니다. 그 결과는 다음 그림과 같습니다.
x = FINDGEN(101)
y1 = SQRT(x)/10
y2 = (x/100)^2
y3 = (x/10)^3/1000
y4 = x/100
win = WINDOW(DIMENSIONS=[600, 600])
p1 = PLOT(x, y1, XRANGE=[0, 100], /CURRENT, LAYOUT=[2, 2, 1], $
THICK=2, COLOR='red')
p2 = PLOT(x, y2, XRANGE=[0, 100], /CURRENT, LAYOUT=[2, 2, 2], $
THICK=2, COLOR='green')
p3 = PLOT(x, y3, XRANGE=[0, 100], /CURRENT, LAYOUT=[2, 2, 3], $
THICK=2, COLOR='blue')
p4 = PLOT(x, y4, XRANGE=[0, 100], /CURRENT, LAYOUT=[2, 2, 4], $
THICK=2, COLOR='magenta')
여기서 LAYOUT 속성은 앞서 제시했던 설명 그림에서와 같은 방식으로 사용되었습니다. 따라서 NG 체계에서 그래픽창의 구획을 나누고 각 구획안에 그림을 그려넣는 방식은 기본적으로 이와 같습니다. 그리고 LAYOUT외에 MARGIN이라는 속성을 사용하면, 각 구획별로 그려지는 플롯의 XY축으로 이루어진 사각형이 좌하우상(left, lower, right, upper)에 두게 되는 여백의 크기를 조정할 수 있습니다. 이때 주의할 점은 XY축으로 이루어진 사각형 자체에만 해당되므로, 축 이외의 요소들(예를 들어 축의 값들을 나타낸 문자나 축 타이틀 등)은 고려되지 않는다는 것입니다. 단, 이 속성에 부여되는 값은 normal 좌표계를 기준으로 합니다. 따라서 0~1 사이의 값이 되어야 한다는 점 역시 유념해야 합니다. 다음과 같이 MARGIN 속성을 추가적으로 사용하여 그림을 그려봅시다. 여기서는 0.1이란 값을 사용하였습니다. 단일값으로 부여했으므로 좌하우상 모두 동일한 여백이 적용됩니다. 이 결과는 다음 그림과 같습니다.
win = WINDOW(DIMENSIONS=[600, 600])
p1 = PLOT(x, y1, XRANGE=[0, 100], MARGIN=0.1, /CURRENT, LAYOUT=[2, 2, 1], $
THICK=2, COLOR='red')
p2 = PLOT(x, y2, XRANGE=[0, 100], MARGIN=0.1, /CURRENT, LAYOUT=[2, 2, 2], $
THICK=2, COLOR='green')
p3 = PLOT(x, y3, XRANGE=[0, 100], MARGIN=0.1, /CURRENT, LAYOUT=[2, 2, 3], $
THICK=2, COLOR='blue')
p4 = PLOT(x, y4, XRANGE=[0, 100], MARGIN=0.1, /CURRENT, LAYOUT=[2, 2, 4], $
THICK=2, COLOR='magenta')
그러면 만약 MARGIN의 값을 0으로 부여하게 되면 어떻게 될까요? XY축 사각형이 구획상에서 여백을 전혀 갖지 않게 됩니다. 따라서 해당 구획이 이 사각형으로 꽉 차게 됩니다. 즉, 위의 예제코드에서 MARGIN의 값을 0.1 대신 모두 0으로 변경하고 그림을 그리면 다음과 같은 결과를 얻게 됩니다.
그런데 이 그림의 문제는 XY축상의 값들을 나타낸 라벨문자들이 외곽으로 밀려나는 바람에 서로 어지럽게 중첩이 되어 버립니다. 따라서 이런 경우에는 라벨문자들을 아예 표시하지 않는 것이 나을 수도 있습니다. 이를 위해서는 XSHOWTEXT, YSHOWTEXT 속성을 사용하면 됩니다. 이 값을 0으로 부여하면 축 라벨문자들을 아예 표시하지 않습니다. 다음과 같이 여백을 0으로 하면서, 라벨문자들을 표시하지 않으면 그 결과는 다음 그림과 같습니다.
win = WINDOW(DIMENSIONS=[600, 600])
p1 = PLOT(x, y1, XRANGE=[0, 100], MARGIN=0, /CURRENT, LAYOUT=[2, 2, 1], $
XSHOWTEXT=0, YSHOWTEXT=0, THICK=2, COLOR='red')
p2 = PLOT(x, y2, XRANGE=[0, 100], MARGIN=0, /CURRENT, LAYOUT=[2, 2, 2], $
XSHOWTEXT=0, YSHOWTEXT=0, THICK=2, COLOR='green')
p3 = PLOT(x, y3, XRANGE=[0, 100], MARGIN=0, /CURRENT, LAYOUT=[2, 2, 3], $
XSHOWTEXT=0, YSHOWTEXT=0, THICK=2, COLOR='blue')
p4 = PLOT(x, y4, XRANGE=[0, 100], MARGIN=0, /CURRENT, LAYOUT=[2, 2, 4], $
XSHOWTEXT=0, YSHOWTEXT=0, THICK=2, COLOR='magenta')
그래서 NG 체계에서 다중 플롯을 그리는 기본적인 방법은 대략 이와 같습니다. 여기서는 대표적인 케이스로서 PLOT 함수를 예로 들었지만, 유사한 성격의 그래픽 함수들(BARPLOT, SCATTERPLOT 등)에서도 공통적으로 사용 가능한 방법이라는 점을 참조하시기 바랍니다.
다만 한가지 여기서 좀 개운치 않은 점은, 마지막에 그렸던 그림처럼 구획별 그림들을 여백없이 붙이는데 있어서 전체가 그래픽창에 완전히 꽉 차버렸다는 것입니다. 사실 이렇게 개별 그래프들끼리는 서로 붙이더라도 전체 그래픽창에서는 약간의 여백을 두는 것이 필요할 수도 있습니다. 하지만 오늘 소개한 LAYOUT, MARGIN 속성만으로는 이러한 연출을 하기가 좀 어려운 것이 사실입니다. 마치 예전에 많이 애용되던 DG 체계의 Multiplot 명령이 했던 것처럼 NG에서도 하려면 어떻게 해야 할 것인가에 대한 문제로 귀결되는데요. 이 문제는 다음 회 게시물에서 다뤄보기로 하겠습니다.
'IDL > New Graphics' 카테고리의 다른 글
PLOT3D에서 구체(Sphere) 심볼 사용법 (0) | 2016.02.29 |
---|---|
NG체계에서 다중 플롯 그리기 (Multi-Plot in NG) [2] - 업데이트! (0) | 2016.02.22 |
CLIP 속성의 이해와 응용 [1] (0) | 2016.01.29 |
Animation GIF의 제작 예제 (NG 기반) (0) | 2016.01.25 |
플롯위에 이미지 중첩하기 (0) | 2016.01.06 |