IDL/New Graphics

BOXPLOT 함수 소개

이상우_idl 2021. 9. 7. 11:15
728x90
반응형

오늘은 NG 체계에서 지원되는 그래픽 함수들 중에서 BOXPLOT 함수에 관하여 소개해보기로 하겠습니다. BOXPLOT 함수는 NG 체계의 그래픽 함수들 중에서도 비교적 나중에 도입된 경우에 속하며 IDL 8.2.2 버전에서부터 지원되기 시작하였습니다. IDL에서 이 함수에 대한 설명을 보면 box and whisker plot 형태의 표출 기능이라고 언급되어 있습니다. 이것은 통계 분야에서 흔히 사용되는 표출 형태로서 5개의 인자들 즉 최소값(Minimum), 1사분위값(25% Quartile), 2사분위값(50% Quartile or Median), 3사분위값(75% Quartile), 최대값(Maximum)을 모두 나타내는 박스 형태의 표출 방식입니다. 즉 이러한 형태의 표출에 특화된 기능을 담당하는 것이 바로 BOXPLOT 함수입니다. 따라서 이 함수를 이용하여 표출을 하기 위해서는 앞서 언급한 5종의 인자들로 구성된 데이터를 입력 인수로 투입해야만 합니다. 그러면 예제를 통하여 그 방법을 살펴보겠습니다. 먼저 예제 데이터는 다음과 같습니다.

 

x = [2015:2020]
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 두 배열이 정의되었습니다. 어차피 가상의 데이터이긴 하지만 대략적으로는 2015년부터 2020년까지 6년 동안의 어떤 데이터에 대한 5종의 통계값들이 주어진 상황으로 가정한 것입니다. HELP에 의하여 출력된 내용을 보면 다음과 같습니다.

 

X               INT       = Array[6]
DATA            FLOAT     = Array[6, 5]

 

이와 같이 data 배열은 6x5의 형태를 갖는 2차원 배열인데 여기서 6은 데이터 포인트의 갯수에 해당되고 5는 5종의 통계값들에 해당됩니다. 즉 이와 같이 Mx5의 형태(M은 데이터 포인트 갯수)로 정의해야 이 배열을 BOXPLOT 함수에 인수로 투입할 수 있습니다. 그리고 함께 정의된 x는 6개의 데이터 포인트들 각각에 대응되는 연도값들로 구성된 1차원 배열입니다. 이 상태에서 BOXPLOT 함수를 다음과 같이 사용해봅시다.

 

win = WINDOW(DIMENSIONS=[600, 500], /NO_TOOLBAR)
bp = BOXPLOT(x, data, THICK=2, $
  XRANGE=[2014, 2021], XMINOR=0, $
  XTITLE='Year', YTITLE='Value', $
  XTICKLEN=0.01, YTICKLEN=0.02, $
  FILL_COLOR='lime', BACKGROUND_COLOR='linen', $
  FONT_SIZE=10, MARGIN=0.1, /CURRENT)

 

여기서는 BOXPLOT 함수에 x 및 data를 입력 인수로 투입하였습니다. 먼저 표출된 결과부터 보면 다음 그림과 같습니다.

 

 

이와 같이 box and whisker 형태의 표출 결과를 얻을 수 있습니다. BOXPLOT 함수도 어차피 기본적인 틀은 플롯의 범주에 속하기 때문에 부가적으로 사용된 속성들은 PLOT 함수에서 사용되는 것들과 거의 비슷합니다. FILL_COLOR 속성을 사용하여 박스 내부를 특정 색상으로 채운다는 것 외에는 큰 차이가 없습니다. 다만 부가 속성들 중에 한가지 더 주목해볼만한 것이 있는데 바로 HORIZONTAL 속성입니다. 앞서 표출된 그림을 보면 박스 형태의 막대들이 세로 방향인데, HORIZONTAL 속성을 사용하면 가로 방향의 막대들로 바꿀 수 있습니다. 단 이런 표출을 위해서는 나머지 속성들 중 일부도 그에 맞게 사용해야 합니다. 이를 위해서는 위의 예제 코드에서 BOXPLOT 함수가 사용된 부분을 다음과 같은 내용으로 대체하면 됩니다.

 

bp = BOXPLOT(x, data, THICK=2, /HORIZONTAL, $
  YRANGE=[2014, 2021], YMINOR=0, $
  YTITLE='Year', XTITLE='Value', $
  YTICKLEN=0.01, XTICKLEN=0.02, $
  FILL_COLOR='lime', BACKGROUND_COLOR='linen', $
  FONT_SIZE=10, MARGIN=0.1, /CURRENT)

 

즉 X축과 Y축이 서로 바뀐 것이기 때문에 관련 속성들(진하게 표시된 부분)도 서로 맞바꿔주는 것이 필요합니다. 표출 결과는 다음 그림과 같습니다.

 

 

그래서 BOXPLOT 함수의 기본적인 사용 방식은 이와 같습니다. 사실 BOXPLOT 함수의 사용 방법 자체는 그리 복잡한 것은 아닙니다. 다만 이 함수에 투입되는 인수 데이터가 반드시 5종의 통계값들을 바탕으로 한 Mx5의 형태의 배열로 구성되어야 한다는 것을 반드시 유의해야 합니다. 그런데 이렇게 5종의 통계값들로 구성된 데이터셋을 이미 갖고있다면 바로 BOXPLOT 함수에 투입하면 되겠지만, 만약 통계값들이 산출되기 이전의 원시자료만 갖고 있을 경우에는 5종 통계값들을 산출하는 과정이 따로 필요합니다. 그래서 IDL에서는 이러한 통계값 데이터를 산출하는 역할을 하는 전용함수도 따로 탑재하고 있는데 바로 CREATEBOXPLOTDATA 함수입니다. 그러면 이 두 함수를 연계하여 사용하는 예제도 소개해보도록 하겠습니다. 일단 예제 데이터는 다음과 같습니다.

 

data0 = [ $
  [20.2, 16.2, 23.8], $
  [21.1, 16.4, 24.1], $
  [21.7, 16.9, 24.7], $
  [22.6, 17.8, 25.0], $
  [24.2, 19.5, 26.2], $
  [25.9, 21.1, 28.1], $
  [26.8, 22.1, 28.8], $
  [24.9, 21.9, 28.4], $
  [22.4, 18.6, 27.1], $
  [21.9, 16.9, 26.7], $
  [21.1, 16.5, 24.9], $
  [20.3, 15.8, 24.3]]
HELP, data0

 

HELP에 의하여 출력된 내용을 보면 data0는 3x12의 형태를 갖는 2차원 배열입니다. 물론 이 데이터 역시 가상의 데이터이긴 한데, 3개의 지역에 대하여 12시간에 걸쳐 측정된 기온값 데이터라고 임의로 가정해봅니다. 이제 이 데이터에 대한 box and whisker plot의 표출을 위하여 BOXPLOT 함수에 바로 투입 가능한 배열을 생성해야 하는데, 이 때 바로 CREATEBOXPLOTDATA 함수를 다음과 같이 사용하면 됩니다.

 

data = CREATEBOXPLOTDATA(data0, MEAN_VALUES=means)
x = [1, 2, 3]
HELP, x, data

 

여기서는 편의상 배열 x도 이와 같이 생성하였으며, HELP에 의하여 출력된 내용은 다음과 같습니다.

 

X               INT       = Array[3]
DATA            DOUBLE    = Array[3, 5]

 

즉 CREATEBOXPLOTDATA 함수에 의하여 생성된 data 배열은 각 지역별 5종의 통계값들로 구성된 3x5 형태의 2차원 배열이 됩니다. 즉 이 배열을 바로 BOXPLOT에 투입하면 됩니다. 그 과정은 다음과 같습니다.

 

win = WINDOW(DIMENSIONS=[600, 500], /NO_TOOLBAR)
bp = BOXPLOT(x, data, THICK=2, WIDTH=0.2, $
  XRANGE=[0, 4], XMINOR=0, $
  XTICKNAME=['', 'AA', 'BB', 'CC', ''], $
  XTITLE='Region', YTITLE='Value', $
  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]과 같이 숫자들로 구성되어 있었지만, 실제 그림을 보면 X축 눈금은 알파벳 문자들로 대체되어 있습니다. 이렇게 축의 눈금에 대하여 숫자 대신 문자열을 표시해야 하는 경우도 있는데, 이를 위하여 BOXPLOT 함수 내에서는 XTICKNAME 속성을 사용하였습니다. 이 부분에서 한가지 유의할 점은 BOXPLOT 함수의 XRANGE 속성에서 X축의 범위를 애초에 0~4로 정의하였기 때문에 표출 그림에서는 눈금이 0, 1, 2, 3, 4 이렇게 5개가 되지만, 실제 데이터가 존재하는 눈금은 1, 2, 3 뿐이기 때문에 XTICKNAME 속성에 부여된 문자값 배열에서 첫번째 및 마지막 값을 null string인 ''으로 처리했다는 것입니다. 이런 것은 그냥 하나의 요령이라고 보면 됩니다.

 

어쨌든 IDL에서도 box and whisker plot을 깔끔하고 쉽게 표출할 수 있으며, 이를 위해서는 기본적으로 BOXPLOT 함수를 사용하면 되고 필요에 따라서는 CREATEBOXPLOTDATA 함수까지도 함께 사용할 수 있다는 것을 알아두시면 좋을 것 같습니다.

반응형