IDL/New Graphics

막대 차트(Bar Chart) 표출하기

이상우_IDL 2025. 12. 9. 16:12
728x90

막대 차트(Bar Chart)는 막대 모양의 그래프를 표출하면서 막대 내에서 값에 따라 마디마디가 구분되어 보이도록 하는 표출 방식을 의미합니다. 이해를 돕기 위하여 예제 그림만 먼저 본다면 다음과 같습니다.

 

 

이 그림에서는 어떤 설문 조사를 6개의 집단들을 대상으로 실시하고 각 카테고리별 응답 비율을 막대 차트의 형태로 표시하고 있습니다. 오늘은 이러한 막대 차트(Bar Chart) 그림을 IDL에서 표출하는 방법을 소개해보고자 합니다. 위의 그림은 당연히 IDL로 표출한 것이며 그 과정을 지금부터 살펴보겠습니다. 먼저 예제 데이터부터 정의해봅시다. 그 과정은 다음과 같습니다.

 

cats = ['very bad', 'bad', 'not bad', 'good', 'very good']
colors = ['red', 'orange', 'yellow', 'light green', 'green']
gnames = ['Group 1', 'Group 2', 'Group 3', 'Group 4', 'Group 5', 'Group 6']
data = [[10, 15, 17, 32, 26], $
  [26, 22, 29, 10, 13], $
  [35, 37, 7, 2, 19], $
  [32, 11, 9, 15, 33], $
  [21, 29, 5, 5, 40], $
  [14, 32, 25, 16, 13]]
HELP, data

 

여기서는 6개의 집단들을 대상으로 5종의 카테고리로 답변을 하도록 하여 각 카테고리별로 응답률(%) 값을 얻은 것으로 가정하였습니다. 그리고 응답률에 해당되는 값들로 구성된 배열 data는 위와 같이 5x6의 2차원 구조를 갖도록 정의하였습니다. 그 외에 cats는 각 카테고리별 명칭, colors는 각 카테고리별 색상, gnames는 각 집단별 명칭에 해당됩니다.

 

이와 같이 데이터가 정의된 상태에서 바로 표출 과정으로 넘어가면 되는데, 기본적으로는 BARPLOT 함수를 사용하게 됩니다. 다만 이러한 과정으로 넘어가기 위해서는 배열 data로부터 각 카테고리별로 값들을 추출하여 개별 배열을 얻는 것이 필요합니다. 따라서 이러한 작업을 다음과 같이 처리합니다.

 

data1 = REFORM(data[0, *])
data2 = REFORM(data[1, *])
data3 = REFORM(data[2, *])
data4 = REFORM(data[3, *])
data5 = REFORM(data[4, *])

 

여기서 얻은 각 배열은 6개의 값들로 구성된 1차원 배열이 됩니다. 즉 data1은 very bad, data2는 bad에 해당되는 방식으로 각 카테고리에 대한 6개 집단들 각각의 응답률 값들로 구성됩니다. 이제 그래픽 창을 띄우고 표출 과정으로 진행합시다. 일단 그 시작은 다음과 같습니다.

 

win = WINDOW(DIMENSIONS=[600, 600], /NO_TOOLBAR)
bp1 = BARPLOT(data1, FILL_COLOR=colors[0], $
  YRANGE=[-5, 105], YTICKINTERVAL=10, YMINOR=0, $
  YTICKLEN=0.02, XTICKLEN=0.01, YTITLE='Percentage (%)', $
  FONT_SIZE=11, MARGIN=[0.12, 0.07, 0.08, 0.13], /CURRENT)

 

이와 같이 그래픽 창을 띄우고 BARPLOT 함수를 사용하여 데이터를 표출하게 되는데, 먼저 첫번째 카테고리(very bad)에 해당되는 data1만을 대상으로 하였습니다. 일단 그 결과를 보면 다음 그림과 같습니다.

 

 

이 그림을 보면 가로 방향이 6개의 집단들에 해당됩니다. 그리고 세로 방향으로 data1의 값들이 막대 형태로 표시되었습니다. 물론 여기서는 X축이 카테고리 데이터의 특성을 아직 제대로 반영하고 있지 않은 상태입니다. 따라서 이러한 목적을 위한 내용을 추가하여 다음과 같이 수정해봅시다.

 

tnms = ['', cats, '']
gnums = INDGEN(N_ELEMENTS(gnames))

win = WINDOW(DIMENSIONS=[600, 600], /NO_TOOLBAR)
bp1 = BARPLOT(data1, FILL_COLOR=colors[0], $
  YRANGE=[-5, 105], YTICKINTERVAL=10, YMINOR=0, $
  XMINOR=0, XTICKNAME=gnames, XTICKVALUES=gnums, $
  YTICKLEN=0.02, XTICKLEN=0.01, YTITLE='Percentage (%)', $
  FONT_SIZE=11, MARGIN=[0.12, 0.07, 0.08, 0.13], /CURRENT)

 

여기서는 X축의 눈금들에 대하여 각 집단별 명칭이 올바른 위치에 표시되도록 하고 또한 마이너 눈금들도 제거한 것입니다. 이러한 변경사항을 반영하면 그 결과는 다음 그림과 같습니다.

 

 

그 다음에는 나머지 카테고리별 데이터를 차곡차곡 반영해야 합니다. 그러면 두번째 카테고리(bad)에 해당되는 data2를 중첩해봅시다. 이를 위해서는 다음과 같은 내용을 추가하면 됩니다.

 

bp2 = BARPLOT(data1+data2, FILL_COLOR=colors[1], $

  BOTTOM_VALUES=data1, /OVERPLOT)

 

여기서는 BARPLOT 함수에 투입되는 데이터가 data2가 아니라 data1+data2가 되어야 한다는 것과 BOTTOM_VALUES 속성에 data1이 부여되어야 한다는 것을 유의하면 됩니다. 이러한 내용까지 실행되면 그 결과는 다음 그림과 같습니다.

 

 

그 다음에는 세번째 카테고리(not bad)에 해당되는 data3을 중첩하기 위하여 다음과 같은 내용을 추가합니다. 물론 BARPLOT 함수에 투입되는 데이터 및 BOTTOM_VALUES 속성에 부여되는 데이터를 설정하는 방식 자체는 동일합니다.

 

bp3 = BARPLOT(data1+data2+data3, FILL_COLOR=colors[2], $

  BOTTOM_VALUES=data1+data2, /OVERPLOT)

 

이 내용까지 실행되면 결과는 다음 그림과 같습니다.

 

 

이제 나머지 카테고리들에 대한 데이터도 동일한 요령으로 중첩하면 됩니다. 그 내용 및 실행 결과는 다음 그림과 같습니다.

 

bp4 = BARPLOT(data1+data2+data3+data4, FILL_COLOR=colors[3], $

  BOTTOM_VALUES=data1+data2+data3, /OVERPLOT)
bp5 = BARPLOT(data1+data2+data3+data4+data5, FILL_COLOR=colors[4], $

  BOTTOM_VALUES=data1+data2+data3+data4, /OVERPLOT)

 

 

이렇게 하면 기본적인 그림은 완성된 셈입니다. 다만 상단에 컬러바를 추가하는 작업이 남아있습니다. 그 과정은 다음과 같이 처리해봅시다.

 

ct = COLORTABLE(colors, NCOLORS=N_ELEMENTS(colors))
cb = COLORBAR(RGB_TABLE=ct, TICKVALUES=FINDGEN(N_ELEMENTS(colors))+0.5, $
  TICKNAME=cats, POSITION=[0.2, 0.93, 0.8, 0.97], /BORDER, FONT_SIZE=10)

 

여기서는 먼저 COLORTABLE 함수를 이용하여 5종의 카테고리별 색상들로만 구성된 컬러테이블 데이터인 ct를 생성합니다. 그리고 COLORBAR 함수를 사용하여 컬러바를 표시하게 되는데 이 때 RGB_TABLE, TICKVALUES, TICKNAME 속성들을 적절히 사용하는 것이 필요합니다. 특히 컬러바의 X축 눈금들의 위치 및 문자를 설정하는 방식에 주목하면 됩니다. 이러한 과정까지 실행되면 그 결과는 다음 그림과 같습니다. 즉 우리가 맨 처음에 보았던 그림과 동일합니다.

 

 

일단 여기까지의 과정에 의하여 얻은 그림은 막대들의 방향이 세로 방향인 막대 차트입니다. 물론 막대들의 방향이 가로 방향인 그림을 얻는 것도 가능합니다. 이러한 작업의 기본적인 흐름은 위의 내용과 거의 유사합니다. 다만 BARPLOT 함수를 사용하는데 있어서 막대들이 가로 방향이 되도록 하기 위하여 HORIZONTAL 속성을 사용해야 하고, X축과 Y축의 특성을 서로 맞바꿔야 한다는 것 등을 유의해야 합니다. 이러한 방법에 관해서는 얼마 전에 올렸던 관련 게시물의 내용을 참조할 필요가 있습니다. 이를 참조하여 전체적인 과정을 보면 다음과 같습니다.

 

win = WINDOW(DIMENSIONS=[600, 600], /NO_TOOLBAR)
bp1 = BARPLOT(data1, /HORIZONTAL, FILL_COLOR=colors[0], $
  XRANGE=[-5, 105], XTICKINTERVAL=10, XMINOR=0, $
  YMINOR=0, YTICKNAME=gnames, YTICKVALUES=gnums, $
  XTICKLEN=0.02, YTICKLEN=0.01, XTITLE='Percentage (%)', $
  FONT_SIZE=11, MARGIN=[0.12, 0.07, 0.08, 0.13], /CURRENT)
bp2 = BARPLOT(data1+data2, /HORIZONTAL, FILL_COLOR=colors[1], $

  BOTTOM_VALUES=data1, /OVERPLOT)
bp3 = BARPLOT(data1+data2+data3, /HORIZONTAL, FILL_COLOR=colors[2], $

  BOTTOM_VALUES=data1+data2, /OVERPLOT)
bp4 = BARPLOT(data1+data2+data3+data4, /HORIZONTAL, FILL_COLOR=colors[3], $

  BOTTOM_VALUES=data1+data2+data3, /OVERPLOT)
bp5 = BARPLOT(data1+data2+data3+data4+data5, /HORIZONTAL, FILL_COLOR=colors[4], $

  BOTTOM_VALUES=data1+data2+data3+data4, /OVERPLOT)
ct = COLORTABLE(colors, NCOLORS=N_ELEMENTS(colors))
cb = COLORBAR(RGB_TABLE=ct, TICKVALUES=FINDGEN(N_ELEMENTS(colors))+0.5, $
    TICKNAME=cats, POSITION=[0.2, 0.93, 0.8, 0.97], /BORDER, FONT_SIZE=10)

 

이 내용을 보면 앞서 막대들이 수직 방향인 그림을 표출했던 과정과 거의 동일하게 보일 수 있습니다. 하지만 앞서 이미 언급했듯이 막대들이 가로 방향이 되도록 하기 위하여 HORIZONTAL 속성을 사용하였고, X축과 Y축의 특성을 맞바꾸기 위하여 관련 속성들을 재설정하였다는 것을 유의해야 합니다. 그러한 부분들은 볼드체로 표시하였습니다. 어쨌든 이러한 내용을 실행하면 그 결과는 다음 그림과 같습니다.

 

 

이와 같이 가로 방향의 막대들로 구성된 막대 차트 그림을 얻을 수 있습니다. 어쨌든 오늘 소개한 바와 같이 IDL에서도 막대 차트를 위와 같은 요령으로 구현할 수 있다는 것을 참조해두시면 좋을 것 같습니다.

 

 

* 이 글이 도움이 되었다면 게시물에 대하여 공감 버튼(하트 모양) 클릭 및 블로그 구독도 해주시면 더 큰 힘이 됩니다. 감사합니다.

LIST