오늘은 NG 체계에서 지원되는 그래픽 함수들 중에서 BOXPLOT 함수에 관하여 소개해보기로 하겠습니다. BOXPLOT 함수는 NG 체계의 그래픽 함수들 중에서도 비교적 나중에 도입된 경우에 속하며 IDL 8.2.2 버전에서부터 지원되기 시작하였습니다. IDL에서 이 함수에 대한 설명을 보면 box and whisker plot(상자 수염 그림) 형태의 표출 기능이라고 언급되어 있습니다. 이것은 통계 분야에서 흔히 사용되는 표출 형태로서 최소값(Minimum), 1사분위값(25% Quartile), 2사분위값(50% Quartile or Median), 3사분위값(75% Quartile), 최대값(Maximum) 등의 5종의 통계값들을 박스 및 에러바(box and error bar)의 형태로 나타내는 표출 방식입니다. 즉 이러한 형태의 표출에 특화된 기능을 담당하는 것이 바로 BOXPLOT 함수입니다. 따라서 이 함수를 이용하여 표출을 하기 위해서는 앞서 언급한 5종의 통계값들로 구성된 데이터를 입력 인수로 투입해야만 합니다. 그러면 예제를 통하여 그 방법을 살펴보겠습니다. 먼저 예제 데이터를 다음과 같이 생성해봅시다.
x = [2019:2024]
data = [ $
[33.1, 59.4, 98.6, 47.8, 37.7, 49.6], $
[58.8, 72.6, 107.3, 78.8, 60.3, 69.6], $
[66.3, 93.3, 120.5, 99.5, 95.4, 89.1], $
[86.6, 109.8, 146.0, 111.8, 108.7, 104.5], $
[117.9, 127.2, 151.1, 127.4, 120.6, 128.8]]
HELP, x, data
여기서는 x 및 data 두 배열이 정의되었습니다. 어차피 가상의 데이터이긴 하지만 대략적으로는 2019년부터 2024년까지 6년 동안의 어떤 데이터에 대한 5종의 통계값들이 주어진 상황으로 가정한 것입니다. HELP에 의하여 출력된 내용을 보면 다음과 같습니다.
X INT = Array[6]
DATA FLOAT = Array[6, 5]
이와 같이 data 배열은 6x5의 형태를 갖는 2차원 배열인데 여기서 6은 데이터 세트의 갯수에 해당되고 5는 5종의 통계값들에 해당됩니다. 즉 BOXPLOT 함수는 Mx5의 형태(M은 데이터 세트의 갯수)로 정의된 배열을 인수로 받을 수 있다는 것을 유의해야 합니다. 그리고 함께 정의된 x는 6개의 데이터 포인트들 각각에 대응되는 연도값들(2019~2024)로 구성된 1차원 배열입니다. 이 상태에서 BOXPLOT 함수를 다음과 같이 사용해봅시다.
win = WINDOW(DIMENSIONS=[600, 500], /NO_TOOLBAR)
bp = BOXPLOT(x, data, THICK=2, $
XRANGE=[2018, 2025], XMINOR=0, $
XTITLE='Year', YTITLE='Value', $
XTICKLEN=0.01, YTICKLEN=0.02, $
FILL_COLOR='orange red', BACKGROUND_COLOR='lavender', $
FONT_SIZE=10, MARGIN=0.1, /CURRENT)
여기서는 BOXPLOT 함수에 x 및 data를 입력 인수로 투입하였습니다. 먼저 표출된 결과부터 보면 다음 그림과 같습니다.

이와 같이 box and whisker 형태의 표출 결과를 얻을 수 있습니다. BOXPLOT 함수도 어차피 기본적인 틀은 플롯의 범주에 속하기 때문에 부가적으로 사용된 속성들은 PLOT 함수에서 사용되는 것들과 거의 비슷합니다. FILL_COLOR 속성을 사용하여 박스 내부를 특정 색상으로 채운다는 것 외에는 큰 차이가 없습니다. 다만 부가 속성들 중에 한가지 더 주목해볼만한 것이 있는데 바로 HORIZONTAL 속성입니다. 앞서 표출된 그림을 보면 박스 형태의 막대들이 세로 방향인데, HORIZONTAL 속성을 사용하면 막대들을 가로 방향으로 변경할 수 있습니다. 단 이런 표출을 위해서는 X축 및 Y축 관련 속성들을 적절히 맞바꿔주는 것도 필요합니다. 위의 데이터를 그대로 이용하면서 막대들이 가로 방향이 되도록 하려면 위의 내용에서 BOXPLOT 함수가 사용된 부분만 다음과 같이 변경하면 됩니다.
bp = BOXPLOT(x, data, THICK=2, /HORIZONTAL, $
YRANGE=[2018, 2025], YMINOR=0, $
YTITLE='Year', XTITLE='Value', $
YTICKLEN=0.01, XTICKLEN=0.02, $
FILL_COLOR='orange red', BACKGROUND_COLOR='lavender', $
FONT_SIZE=10, MARGIN=[0.13, 0.1, 0.07, 0.1], /CURRENT)
앞서 언급했듯이 이러한 과정에서 X축과 Y축의 특성을 서로 맞바꾸기 위하여 해당 속성들(볼드체로 표시)도 다시 설정한 것도 유의해야 합니다. 표출 결과는 다음 그림과 같습니다.

그래서 BOXPLOT 함수의 기본적인 사용 방식은 이와 같습니다. 사실 BOXPLOT 함수의 사용 방법 자체는 그리 복잡한 것은 아닙니다. 다만 이 함수에 투입되는 인수 데이터가 반드시 5종의 통계값들을 바탕으로 한 Mx5의 형태의 배열로 구성되어야 한다는 것을 반드시 유의해야 합니다. 그런데 이렇게 5종의 통계값들로 구성된 데이터 셋을 이미 갖고있다면 바로 BOXPLOT 함수에 투입하면 되겠지만, 만약 통계값들이 산출되기 이전의 원시자료만 갖고 있을 경우에는 5종의 통계값들을 산출하는 과정이 따로 필요합니다. 그래서 IDL에서는 이러한 통계값 데이터를 산출하는 역할을 하는 CREATEBOXPLOTDATA 함수가 지원됩니다. 그러면 이 두 함수를 연계하여 사용하는 예제도 소개해보도록 하겠습니다. 일단 예제 데이터는 다음과 같습니다.
data0 = [$
[20.2, 16.2, 23.8, 18.7], $
[21.1, 16.4, 24.1, 19.1], $
[21.7, 16.9, 24.7, 19.6], $
[22.6, 17.8, 25.0, 20.9], $
[24.2, 19.5, 26.2, 22.8], $
[25.9, 21.1, 28.1, 23.4], $
[26.8, 22.1, 28.8, 23.7], $
[24.9, 21.9, 28.4, 22.9], $
[22.4, 18.6, 27.1, 20.4], $
[21.9, 16.9, 26.7, 19.3], $
[21.1, 16.5, 24.9, 18.4], $
[20.3, 15.8, 24.3, 17.9]]
HELP에 의하여 출력된 내용을 보면 data0는 4x12의 형태를 갖는 2차원 배열입니다. 물론 이 데이터 역시 가상의 데이터인데, 4개의 관측 지점들에 대하여 일정한 시간 간격으로 12회에 걸쳐 측정된 기온값 데이터라고 가정해봅시다. 이제 이 데이터에 대한 box and whisker plot의 표출을 위하여 BOXPLOT 함수에 바로 투입 가능한 배열을 생성해야 하는데, 이 때 바로 CREATEBOXPLOTDATA 함수를 다음과 같이 사용하면 됩니다.
data = CREATEBOXPLOTDATA(data0, MEAN_VALUES=means)
x = [1, 2, 3, 4]
HELP, x, data
여기서는 편의상 배열 x도 이와 같이 생성하였으며, HELP에 의하여 출력된 내용은 다음과 같습니다.
X INT = Array[4]
DATA DOUBLE = Array[4, 5]
이 내용을 보면 data는 4x5 형태인 2차원 배열이 됩니다. 즉 4개의 지점들에 각각에 대한 5종의 통계값들로 구성된 Mx5 형태의 배열(여기서 M은 4)을 획득한 것입니다. 이 배열을 BOXPLOT 함수에 투입하면 됩니다. 그 과정은 다음과 같습니다.
win = WINDOW(DIMENSIONS=[600, 500], /NO_TOOLBAR)
tnms = ['','AA','BB','CC','DD','']
bp = BOXPLOT(x, data, THICK=2, WIDTH=0.3, $
XRANGE=[0, 5], XMINOR=0, XTICKNAME=tnms, $
XTITLE='Site', YTITLE='Temperature', $
XTICKLEN=0.01, YTICKLEN=0.02, $
FILL_COLOR='orchid', BACKGROUND_COLOR='aquamarine', $
FONT_SIZE=10, MARGIN=0.1, /CURRENT)
이 내용을 보면 앞선 예제와 전반적으로 비슷하지만 몇몇 부분이 약간 다르긴 합니다. 일단 표출 결과부터 먼저 보면 다음 그림과 같습니다.

표출의 과정 및 결과 그림을 보면 앞선 예제와 차이가 큰 부분은 바로 X축의 눈금입니다. 여기서 BOXPLOT 함수에 투입된 배열 x는 표출에 있어서 X축 눈금에 해당되며 [1, 2, 3, 4]와 같이 숫자들로 구성되어 있었지만, 실제 그림을 보면 X축 눈금은 알파벳 문자들로 대체되어 있습니다. 이렇게 축의 눈금에 대하여 숫자 대신 문자열을 표시하기 위하여 BOXPLOT 함수 내에서 XTICKNAME 속성을 사용하였습니다. 이 부분에서 유의할 점은 BOXPLOT 함수의 XRANGE 속성에서 X축의 범위를 애초에 0~5로 정의하였기 때문에 그림에서는 눈금이 0, 1, 2, 3, 4, 5 이렇게 6개가 되지만, 실제 데이터가 존재하는 눈금은 1, 2, 3, 4 뿐이기 때문에 XTICKNAME 속성에 부여된 문자값 배열 tnms에서 첫번째 및 마지막 값을 null string인 ''으로 처리했다는 것만 유의하면 됩니다.
그리고 이번에도 막대들이 수직 대신 수평 방향이 되도록 하는 것도 가능합니다. 이를 위하여 BOXPLOT 함수가 사용된 부분만 다음과 같이 변경해봅시다.
bp = BOXPLOT(x, data, THICK=2, /HORIZONTAL, WIDTH=0.3, $
YRANGE=[0, 5], YMINOR=0, XMINOR=1, YTICKNAME=tnms, $
YTITLE='Site', XTITLE='Temperature', YTICKLEN=0.01, XTICKLEN=0.02, $
XTICKINTERVAL=1, FILL_COLOR='orchid', BACKGROUND_COLOR='aquamarine', $
FONT_SIZE=10, MARGIN=0.1, /CURRENT)
전반적인 요령은 앞선 섹션에서 소개된 내용과 동일합니다. 즉 HORIZONTAL 속성을 사용하고 X축과 Y축의 속성들을 교환하고 살짝 더 다듬어주면 됩니다. 표출 결과는 다음 그림과 같습니다.

어쨌든 IDL에서도 box and whisker plot을 쉽게 표출할 수 있으며, 이를 위해서는 기본적으로 BOXPLOT 함수를 사용하면 되고 필요에 따라서는 CREATEBOXPLOTDATA 함수까지도 함께 사용할 수 있다는 것을 알아두시면 좋을 것 같습니다.
그리고 CREATEBOXPLOTDATA 함수를 사용하여 산출되는 5종의 통계값들 중 중간값(Median)이 산출되는 방식에 있어서 한가지 유의할 사항이 있습니다. 위의 예제에서 이 함수에 투입된 배열인 data0는 4개의 관측 지점들에 대하여 12회에 걸쳐 얻어진 값들이라고 가정하여 4x12 구조의 2차원 배열이 되는데, 이것은 중간값을 산출하는데 있어서 각 지점별로 12개의 값들을 대상으로 한다는 의미입니다. 그런데 이와 같이 짝수 갯수인 데이터를 대상으로 중간값을 얻을 경우에는 정확히 중간 순위에 해당되는 값이 존재하지 않기 때문에 그 주변 값 두 개에 대한 평균으로 산출됩니다. 즉 12개의 값들을 대상으로 하는 경우에는 6위 및 7위에 해당되는 값들에 대한 평균값이 중간값으로 간주됩니다. 따라서 CREATEBOXPLOTDATA 함수가 중간값을 산출하는 방식은 중간값 산출용 함수인 MEDIAN 함수를 /EVEN 키워드와 사용하는 경우와 동일하다는 것을 일단 유념해야 합니다. 그런데 만약 /EVEN 키워드 없이 MEDIAN 함수를 사용하는 방식으로 중간값을 산출하여 반영하고자 한다면 별도의 처리 작업을 따로 해줘야 합니다. 이를 위해서는 위에서 BOXPLOT 함수가 사용되기 이전에 다음과 같은 작업을 추가하면 됩니다.
mdns = MEDIAN(data0, DIMENSION=2)
data[*, 2] = mdns
이것은 원시자료인 data0의 두번째 차원(12개)을 대상으로 중간값을 직접 산출한 mdns를 얻은 다음, BOXPLOT 함수에 투입될 4x5 구조의 data 배열 내에서 중간값들에 해당되는 부분(두번째 차원의 세번째 열)을 이 mdns로 대체하는 작업입니다. 이러한 과정을 추가하여 다시 실행하면 그 결과는 다음 그림과 같습니다. 바로 위의 그림과 대조해보면 각 박스 내에서 중간값을 나타내는 마디 부분의 위치가 바뀐 것을 확인할 수 있습니다.

방금 언급된 MEDIAN 함수의 중간값 산출 방식에 있어서 /EVEN 키워드의 역할에 관해서는 관련 게시물의 내용을 참조하시면 됩니다.
그 외에도 BOXPLOT 함수에 투입되는 Mx5 형태의 2차원 배열에서 두번째 차원이 5종의 통계값들에 해당된다는 것을 계속 언급하였는데요. 유저의 필요에 따라서는 꼭 통계값들이 아니어도 됩니다. 즉 그냥 유저가 직접 지정한 5종의 값들이 되어도 됩니다. 다만 이런 경우에는 값들이 오름차순으로 증가해야 합니다. 즉 예를 들면 [10, 30, 40, 50, 80]과 같은 방식은 되지만 [30, 10, 40, 80, 50]과 같은 방식은 안됩니다. 이러한 특성도 함께 염두에 두시면 좋을 것 같습니다.
* 이 내용은 지난 2021년에 올렸던 게시물의 내용을 수정 및 보강하여 다시 새롭게 올리는 것입니다. 따라서 기존의 게시물은 삭제하고 이번에 작성한 게시물로 대체합니다.
* 이 글이 도움이 되었다면 게시물에 대하여 공감 버튼(하트 모양) 클릭 및 블로그 구독도 해주시면 더 큰 힘이 됩니다. 감사합니다.
'IDL > New Graphics' 카테고리의 다른 글
| 막대 차트(Bar Chart) 표출하기 (0) | 2025.12.09 |
|---|---|
| 2종의 막대 그래프를 서로 붙여서 표출하기 (0) | 2025.11.27 |
| 바코드 형태의 이미지의 표출 및 응용 [2] (0) | 2025.11.17 |
| 바코드 형태의 이미지의 표출 및 응용 [1] (0) | 2025.11.11 |
| 색상을 채운 플롯(Filled Plot)의 표출 [3] (0) | 2025.11.05 |