IDL/New Graphics

색상을 채운 플롯(Filled Plot)의 표출 [3]

이상우_idl 2021. 3. 3. 16:45
728x90
반응형

NG 체계에서 색상을 채운 플롯(Filled Plot)을 표출하는 방법에 관한 게시물을 제가 이전에 두번에 걸쳐 올렸던 바가 있습니다.

 

색상을 채운 플롯(Filled Plot)의 표출 [1]

색상을 채운 플롯(Filled Plot)의 표출 [2]

 

그런데 비슷한 주제이지만 함께 공유하면 좋을만한 또 다른 관련 예제가 있어서 오늘 이렇게 동일한 제목의 세번째 게시물로 올리게 되었습니다. 오늘 사용할 예제 데이터는 다음과 같습니다.

 

x = FINDGEN(51)

y = SIN(2.0*x*!PI/25)*EXP(-0.02*x)

 

그러면 이 데이터를 선과 심볼들로만 구성된 통상적인 플롯의 형태로 먼저 표출해봅시다. 그 과정은 다음과 같습니다.

 

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

p0 = PLOT(x, y, SYMBOL='circle', /SYM_FILLED, $

  THICK=2, FONT_SIZE=12, /CURRENT)

 

그리고 표출된 그림은 다음과 같습니다.

 

 

이제 이러한 플롯상에서 Y축의 값이 0.25인 수평선을 기준으로 색상을 채우는 방식으로 표출해보겠습니다. 이를 위하여 앞서 PLOT 함수가 사용되었던 내용에 다음과 같이 FILL_BACKGROUND, FILL_COLOR, FILL_LEVEL 속성들을 추가적으로 사용합니다.

 

p0 = PLOT(x, y, SYMBOL='circle', /SYM_FILLED, $

  /FILL_BACKGROUND, FILL_COLOR='orange', FILL_LEVEL=0.25, $

  THICK=2, FONT_SIZE=12, /CURRENT)

 

이러한 과정을 거치게 되면 Y값이 0.25인 수평선을 기준으로 플롯의 안쪽 부분이 색상으로 채워지게 됩니다. 그 모습은 다음 그림과 같습니다.

 

 

이 그림을 보면 수평선을 기준으로 플롯의 안쪽 부분이 모두 색상으로 채워져 있습니다. 색상이 채워진 안쪽 부분은 수평선의 윗 부분인 경우도 있고 아랫 부분인 경우도 있습니다. 물론 이 결과는 FILL_ 계열 속성들이 정상적으로 작동하여 표출된 정상적인 모습이긴 합니다. 그런데 여기서 만약 수평선의 윗 부분만 색상이 채워지고 아랫 부분은 채워지지 않도록 하려면 어떻게 해야 할까요? 실제로 그러한 표출이 필요한 경우가 종종 있을 것입니다. 그런데 여기서 사용된 FILL_ 계열의 속성들 자체에는 그렇게 위 또는 아래를 선택하는 기능까지는 포함되어 있지 않습니다. 따라서 그런 방식으로 구현하려면 약간의 추가적인 터치가 필요합니다. 그래서 이를 위한 일종의 요령을 소개하도록 하겠습니다. 이것은 그냥 제가 개인적으로 찾은 하나의 방법일 뿐이고 최적의 해결책이 아닐 수도 있음을 미리 말씀드립니다.

 

먼저 기준 높이인 Y값인 0.25라는 값들로만 구성된 또 다른 Y값 배열을 다음과 같이 y_flat이라는 이름으로 만듭니다.

 

y_flat = MAKE_ARRAY(N_ELEMENTS(x), VALUE=0.25)

 

이렇게 생성되는 y_flat은 원소값들의 갯수는 원래 데이터인 x 또는 y와 같습니다. 다만 모든 원소값들이 일괄적으로 0.25가 됩니다. 그 다음에는 다음과 같이 또 다른 플롯을 중첩합니다.

 

p1 = PLOT(x, y_flat, /FILL_BACKGROUND, FILL_COLOR='white', $

  FILL_LEVEL=-1, LINESTYLE=6, /OVERPLOT)

 

이 과정은 x, y_flat 데이터로 플롯을 표출하면서 FILL_ 계열 속성들을 사용하여 Y축의 바닥부터 0.25까지의 공간이 흰색(배경색과 동일한 색상)으로 채워지도록 한 것입니다. 여기까지의 과정에 의한 표출 결과는 다음 그림과 같습니다.

 

 

물론 이게 끝은 아닙니다. 여기서 다음과 같이 또 다른 플롯을 중첩합니다.

 

p2 = PLOT(x, y, THICK=2, SYMBOL='circle', /SYM_FILLED, /OVERPLOT)

 

이 과정은 앞서 p1 플롯이 덮어버린 원래 플롯의 선과 심볼들이 보이도록 하기 위하여 선과 심볼들로만 구성된 플롯을 새로 덧그린 것이라고 보면 됩니다. 여기까지의 과정에 의한 표출 결과는 다음 그림과 같습니다.

 

 

물론 다소 귀찮은 것은 사실이지만 이러한 요령을 사용하면 우리가 목표로 했던 결과를 얻을 수가 있습니다. 그러면 이번에는 반대로 수평선의 아랫 부분만 색상이 채워지도록 하려면 어떻게 하면 될까요? 이것도 역시 요령이 필요합니다. 일단 앞서 p0 플롯까지 구현했던 내용을 그대로 두고, 나머지는 다음과 같은 내용으로 대체하면 됩니다.

 

y_flat = MAKE_ARRAY(N_ELEMENTS(x), VALUE=1.0)

p1 = PLOT(x, y_flat, /FILL_BACKGROUND, FILL_COLOR='white', $

  FILL_LEVEL=0.25, LINESTYLE=6, /OVERPLOT)

p2 = PLOT(x, y, THICK=2, SYMBOL='circle', /SYM_FILLED, /OVERPLOT)

 

이 과정에서는 먼저 y_flat 배열의 값들이 모두 1.0으로 통일됩니다. 1.0은 Y축 범위의 최대값입니다. 그리고 흰색으로 채워진 플롯을 덧그릴 때 FILL_LEVEL 속성의 값을 0.25로 설정함으로써 0.25 윗 부분만 흰색으로 덮어지도록 합니다. 그러면 0.25 아랫 부분의 orange 색으로 채워졌던 부분은 그대로 살아남습니다. 그런 다음에 선과 심볼들만으로 구성된 p2 플롯을 덧그리면 됩니다. 그 결과는 다음 그림과 같습니다.

 

 

이와 같이 색상이 채워진 플롯을 표출하는데 있어서 기준선의 위쪽 또는 아래쪽만 선택적으로 색상이 채워지도록 하려면 PLOT 함수의 FILL_ 계열 속성들만으로 바로 해결되지는 않기 때문에 이러한 약간의 추가적인 코딩이 필요합니다. 물론 여기서 제시된 내용은 제가 생각하는 일종의 요령일 뿐며 더 나은 방법이 있을 수도 있다는 점을 염두에 두시기 바랍니다.

반응형