IDL에서 플롯의 선 사이를 색상으로 채워서 표출하기 위해서는 기본적으로 FILLPLOT 함수를 사용하면 됩니다. 이 함수는 IDL 8.7.2 버전에서 처음 도입되었으며 이 블로그에서도 예전에 관련 게시물을 통하여 간단히 소개를 한 바 있습니다. 다만 이번에는 색상을 채운 플롯을 표출하는 방법이라는 주제로 좀 더 일반화를 시켜서 FILLPLOT 함수를 사용하는 방법 및 그 외의 경우들도 자세히 소개해보고자 합니다. 오늘은 먼저 FILLPLOT 함수를 사용하는 방법을 중심으로 관련 예제들과 함께 살펴보겠습니다.
먼저 예제 데이터를 생성해봅시다. 그 과정은 다음과 같습니다.
n = 21
x = FINDGEN(n)
y1 = SIN(x)*10+15+RANDOMU(-1, n)*6-3
y2 = SIN(x)*10+30+RANDOMU(-2, n)*6-3
여기서 x, y1, y2 각각은 21개의 값들로 구성된 1차원 배열입니다. 즉 동일한 x를 공유하는 y1 및 y2 데이터가 되도록 해보았습니다. 이러한 데이터를 X축 및 Y축으로 구성된 2차원 공간상에서 플롯의 형태로 표출하되 두 라인 사이의 공간을 특정한 색상으로 채우기 위하여 FILLPLOT 함수를 사용하고자 합니다. 그 과정은 다음과 같습니다.
win_fph1 = WINDOW(DIMENSIONS=[600, 600], /NO_TOOLBAR)
fph1a = FILLPLOT(x, [[y1], [y2]], COLOR='blue', FILL_COLOR='salmon', $
XTITLE='Time', YTITLE='Value', YRANGE=[0, 50], TRANSPARENCY=0, $
THICK=2, MARGIN=0.1, FONT_SIZE=11, /CURRENT)
여기서 FILLPLOT 함수의 내용을 잘 보면 인수들이 x, [[y1], [y2]]와 같은 형태로 주어진 것이 보입니다. 특히 y1, y2를 묶어서 [[y1], [y2]]와 같은 형태로 구성하는 것이 중요합니다. 이렇게 하면 21x2의 구조를 갖는 2차원 배열이 되는데, 이와 같이 FILLPLOT 함수에 대해서는 Y 데이터를 반드시 Nx2 또는 2xN의 형태를 갖는 2차원 배열로 부여해야 한다는 것을 유의해야 합니다. 그리고 플롯 라인 사이를 채울 색상은 FILL_COLOR 속성으로 설정하면 됩니다. 그리고 TRANSPARENCY 속성을 0으로 설정하여 완전 불투명으로 색상을 표시하도록 하였는데, 이러한 설정을 안할 경우에는 무슨 이유인지 색상 표시에 있어서 약간의 투명도가 적용되는 현상이 있는 것 같아서 굳이 이러한 처리를 하는 것이 좋을 것 같습니다. 어쨌든 표출 결과는 다음 그림과 같습니다.
이번에는 Y 데이터를 하나 더 추가해봅시다. 즉 다음과 같이 y3을 추가로 정의합니다.
y3 = SIN(x)*6+40+RANDOMU(-2, n)*6-3
이 데이터는 앞서 정의한 y1, y2보다도 더 큰 값들이기 때문에 Y축 방향으로 y2 플롯보다 더 위에 위치하게 됩니다. 이러한 데이터를 추가로 사용하여 y2와 y3 플롯 사이의 색상을 다른 색으로 채워서 표출해보고자 합니다. 즉 y1, y2, y3 데이터에 대한 플롯들을 함께 표출하면서 y1과 y2 사이 그리고 y2와 y3 사이를 서로 다른 색상으로 채우는 방식으로 표출을 해보는 것입니다. 그러면 새로운 그래픽창을 띄우고 이러한 작업을 진행해봅시다. 그 과정은 다음과 같습니다.
win_fph2 = WINDOW(DIMENSIONS=[600, 600], /NO_TOOLBAR)
fph2a = FILLPLOT(x, [[y1], [y2]], COLOR='blue', FILL_COLOR='salmon', $
XTITLE='Time', YTITLE='Value', YRANGE=[0, 50], TRANSPARENCY=0, $
THICK=2, MARGIN=0.1, FONT_SIZE=11, /CURRENT)
fph2b = FILLPLOT(x, [[y2], [y3]], COLOR='blue', FILL_COLOR='khaki', $
TRANSPARENCY=0, THICK=2, /OVERPLOT)
이와 같이 y1, y2에 대한 플롯을 먼저 표출하고 그 위에 y2, y3에 대한 플롯을 중첩하는 방식으로 처리하면 됩니다. 표출 결과는 다음 그림과 같습니다.
따라서 색상을 채운 플롯(Filled Plot)을 표출하기 위해서는 위와 같이 FILLPLOT 함수를 사용하면 됩니다. 그런데 이와 같은 표출에 있어서 FILLPLOT 대신 그냥 PLOT 함수를 사용하는 것도 가능합니다. 이를 위해서는 PLOT 함수에서 지원되는 속성들 중 FILL_BACKGROUND, FILL_COLOR, FILL_LEVEL 속성을 사용하면 됩니다. 만약 위의 예제 데이터를 그대로 사용하여 PLOT 함수를 사용하여 동일한 표출을 해본다면 그 과정은 다음과 같습니다.
win_fph3 = WINDOW(DIMENSIONS=[600, 600], /NO_TOOLBAR)
fph3a = PLOT(x, y3, COLOR='blue', /FILL_BACKGROUND, $
FILL_COLOR='khaki', FILL_LEVEL=0, XTITLE='Time', YTITLE='Value', $
YRANGE=[0, 50], THICK=2, MARGIN=0.1, FONT_SIZE=11, /CURRENT)
fph3b = PLOT(x, y2, COLOR='blue', /FILL_BACKGROUND, $
FILL_COLOR='salmon', FILL_LEVEL=0, THICK=2, /OVERPLOT)
fph3c = PLOT(x, y1, COLOR='blue', /FILL_BACKGROUND, $
FILL_COLOR='white', FILL_LEVEL=0, THICK=2, /OVERPLOT)
기본적으로는 플롯의 라인 밑부분을 특정한 색상으로 채우는 방식이며, 여기서는 색상을 채우는 Y축 방향의 범위가 위쪽은 Y 데이터 값들이 되고 아래쪽은 0이 되도록 하였습니다. 다만 주목해야 할 부분은 PLOT 함수를 세번에 걸쳐 사용하되 y3, y2, y1의 순서로 처리한 것입니다. 굳이 이렇게 한 이유는 y3 데이터가 값들이 가장 커서 Y축 방향으로 가장 높은 곳에 위치하기 때문에 이러한 플롯을 먼저 색상을 채워서 표시하고, 그 이후에는 값들이 낮은 순서대로 y2, y1의 순서로 표출하도록 한 것입니다. 만약 순서가 반대가 되면 나중에 표출되는 플롯이 이전의 플롯을 덮어버리기 때문입니다. 그리고 순서상으로 세번째에 해당되는 y1 플롯의 경우는 채우는 색상을 흰색(white)으로 설정하였습니다. 이와 같이 맨 아래에 위치하는 플롯에 대해서 채우는 색상을 흰색으로 설정해야 그 부분이 흰색으로 보이기 때문입니다. 따라서 위의 내용을 실행하면 표출 결과는 다음 그림과 같습니다.
이 그림을 보면 앞서 FILLPLOT 함수를 사용한 경우와 거의 유사합니다. 따라서 색상을 채운 플롯을 표출하는데 있어서는 FILLPLOT 함수를 사용하는 방법 뿐 아니라 그냥 PLOT 함수로도 어느 정도 커버가 된다고 볼 수 있습니다. 그런데 오늘 표출해본 그림들은 모두 색상을 수평 방향으로 채운 플롯들이었습니다. 그렇다면 색상을 수직 방향으로 채운 플롯들도 구현이 가능할까요? 사실 가능은 합니다. 다만 오늘 소개한 것과는 다른 접근 방법이 필요합니다. 이와 관련해서는 다음 회차에서 다뤄보기로 하겠습니다.
이 글이 도움이 되었다면 게시물에 대하여 공감 버튼(하트 모양) 클릭 및 블로그 구독도 해주시면 더 큰 힘이 됩니다. 감사합니다.
'IDL > New Graphics' 카테고리의 다른 글
VECTOR 함수로 바람깃(Wind Barb) 표시하기 [2] (0) | 2025.02.25 |
---|---|
VECTOR 함수로 바람깃(Wind Barb) 표시하기 [1] (0) | 2025.02.20 |
그래픽 창의 캡쳐(capture) 기능 (NG 체계) (0) | 2024.11.21 |
동영상 파일의 제작 [3] (Animation GIF) (3) | 2024.11.13 |
동영상 파일의 제작 [2] (WRITE_VIDEO) (2) | 2024.11.12 |