색상을 채운 플롯(Filled Plot)의 표출 [1]
NG 체계의 그래픽 함수들 중 아무래도 가장 많이 사용되는 것이 바로 PLOT 함수일 것 같습니다. 오늘은 이 PLOT 함수의 여러 기능들 중, 색상을 채워서 그리는 기능에 관한 소개 및 팁을 올려볼까 합니다. PLOT에서 색상을 채운다는 의미는 대단한 것이 아니고 플롯 선 아래 부분을 색으로 채워서 그린다는 의미입니다. 설명을 위하여 다음과 같은 예제 플롯을 한번 그려봤습니다. 예제 데이터는 0~360의 범위를 갖는 각도에 대한 SIN 곡선의 형태로서, y값은 일반적인 SIN값에 2를 더하였습니다. 따라서 y의 범위는 1~3이 됩니다. 다음 그림에서 왼쪽은 색상을 채우지 않은 기본적인 형태이고, 오른쪽은 색상을 채운 형태입니다.
그리고 위 그림을 그리기 위하여 사용된 코드는 다음과 같습니다. 여기서는 오른쪽 그림을 그리기 위하여 사용된 PLOT 함수내에서 FILL_BACKGROUND, FILL_COLOR와 같은 속성들이 사용되었다는 점을 주목하면 됩니다. 전자는 말 그대로 플롯선 밑부분을 색으로 채우란 의미이고, 후자는 그 색상을 뭘로 할지를 정하는 역할을 합니다.
x = FINDGEN(361)
y = SIN(x*!dtor)+2
win = WINDOW(DIMENSIONS=[1000, 400])
p1 = PLOT(x, y, THICK=2, XRANGE=[0, 360], XTICKINTERVAL=90, $
/CURRENT, LAYOUT=[2, 1, 1])
p2 = PLOT(x, y, THICK=2, XRANGE=[0, 360], XTICKINTERVAL=90, $
/FILL_BACKGROUND, FILL_COLOR='orange', /CURRENT, LAYOUT=[2, 1, 2])
그런데 위 그림을 보면 Y축의 범위가 y데이터의 범위인 1~3인 상태인데요. 만약 이 축범위를 1~3이 아닌 0~3으로 바꾸면 약간 난감한 상황이 발생합니다. 즉, 아래 그림에서 왼쪽과 같은 형태로 나타납니다. Y축상에서 1 아래 부분인 0~1에 해당되는 부분은 색상이 채워지지 않는다는 문제입니다. 우리가 원하는 것은 아래 그림 오른쪽과 같이 모든 부분이 채워진 형태가 되어야 하겠지요.
위의 두 그림을 그리는데 사용된 코드는 다음과 같습니다. 결정적 차이는 바로 오른쪽 그림을 그린 PLOT 함수에서 사용된 FILL_LEVEL이라는 속성입니다. 여기서는 이 속성에 대하여 0이란 값을 설정함으로써 색상이 Y축상의 0인 부분까지 채워지도록 했습니다.
win = WINDOW(DIMENSIONS=[1000, 400])
p1 = PLOT(x, y, THICK=2, XRANGE=[0, 360], XTICKINTERVAL=90, YRANGE=[0, 3], $
/FILL_BACKGROUND, FILL_COLOR='orange', /CURRENT, LAYOUT=[2, 1, 1])
p2 = PLOT(x, y, THICK=2, XRANGE=[0, 360], XTICKINTERVAL=90, YRANGE=[0, 3], $
/FILL_BACKGROUND, FILL_COLOR='orange', FILL_LEVEL=0, /CURRENT, LAYOUT=[2, 1, 2])
사실 이 FILL_LEVEL이란 속성을 잘 사용하면 다음과 같은 그림도 그려볼 수 있습니다. 어차피 이 속성에 부여되는 값의 정확한 의미는 플롯의 선과 이 값 사이를 색으로 채우라는 의미입니다. 반드시 아래쪽 또는 위쪽 부분이라는 제한은 없습니다. 왼쪽 그림은 FILL_LEVEL의 값을 2.0으로 설정한 경우이고 오른쪽 그림은 1.5로 설정한 경우입니다.
그리고 이 그림을 그리는데 사용된 코드는 다음과 같습니다.
win = WINDOW(DIMENSIONS=[1000, 400])
p1 = PLOT(x, y, THICK=2, XRANGE=[0, 360], XTICKINTERVAL=90, YRANGE=[0, 3], $
/FILL_BACKGROUND, FILL_COLOR='orange', FILL_LEVEL=2, /CURRENT, LAYOUT=[2, 1, 1])
p2 = PLOT(x, y, THICK=2, XRANGE=[0, 360], XTICKINTERVAL=90, YRANGE=[0, 3], $
/FILL_BACKGROUND, FILL_COLOR='orange', FILL_LEVEL=1.5, /CURRENT, LAYOUT=[2, 1, 2])
위에서 소개한 색상 채우기 기능을 잘 사용하면 아래 그림과 같이 단계적으로 색상이 채워진 PLOT도 그려볼 수 있습니다. 여기서는 세 개의 y 데이터를 한꺼번에 중첩해서 그리는 방법을 사용하였는데, 다만 유의할 점은 y축의 값이 큰 플롯을 먼저 그리면서 색상을 채우고, 그 다음으로 y축 값이 낮은 플롯 순서로 그려야 한다는 것입니다. 순서가 반대가 되면, 뒤의 플롯이 색상을 채우면서 앞 플롯을 완전히 덮어버리기 때문입니다.
이 그림을 그리는데 사용된 코드는 다음과 같습니다.
n = 101
x = FINDGEN(n)
y1 = x^0.5
y2 = x^0.5 + 5
y3 = x^0.5 + 10
win = WINDOW(DIMENSIONS=[600, 500])
p1 = PLOT(x, y3, THICK=2, /FILL_BACKGROUND, FILL_LEVEL=0, FILL_COLOR='green', /CURRENT)
p2 = PLOT(x, y2, THICK=2, /FILL_BACKGROUND, FILL_LEVEL=0, FILL_COLOR='gold', /OVERPLOT)
p3 = PLOT(x, y1, THICK=2, /FILL_BACKGROUND, FILL_LEVEL=0, FILL_COLOR='crimson', /OVERPLOT)