IDL/New Graphics

3차원 막대그래프(?)의 표출

이상우_idl 2022. 2. 8. 14:24
728x90
반응형

글 제목에서 사용한 용어가 약간 애매할 수 있는데, 일단 2차원 막대그래프는 NG 체계에서 BARPLOT 함수를 사용하여 표출되는 2차원 평면상의 막대그래프를 의미합니다. 예를 들면 다음 그림과 같습니다.

 

 

참고로 위의 그림은 어떤 데이터에 대하여 HISTOGRAM 함수를 적용하여 값의 구간별 빈도분포를 얻고 그 결과를 표출한 것으로서, 그 과정에 대해서는 제가 얼마전에 올렸던 게시물에 소개한 바 있습니다. 그런데 오늘 언급할 3차원 막대그래프라는 것은 말 그대로 차원을 하나 더 늘려서 3차원 공간상에서 표출되는 막대그래프를 의미합니다. 즉 막대 하나하나가 3차원적인 육면체가 되는 경우입니다. 그리고 앞서 2차원 막대그래프를 표출하는데 있어서는 1차원적인 데이터가 사용되었지만, 3차원 막대그래프를 표출하는데 있어서는 2차원적인 데이터가 사용되어야 합니다. 예를 든다면 10x10의 구조를 갖는 2차원 배열도 가능할 것입니다. 그래서 이러한 2차원적인 데이터를 3차원 막대그래프의 형태로 표출하는 방법을 소개해보고자 합니다.

 

사실 원래는 2차원적인 데이터를 표출하는 방식에는 기본적으로 이미지(Image), 등위선(Contour), 서피스(Surface) 등이 있습니다. 일단 예제 2차원 데이터를 하나 생성하면서 시작해보기로 하겠습니다. 여기서는 제가 얼마전에 소개했던 HIST_2D 함수에 관한 게시물의 내용을 가져와서 2차원 예제 데이터를 얻어보고자 하는데, 그 과정은 다음과 같습니다.

 

xx = RANDOMU(seed, 1000, /NORMAL)*10+50
yy = RANDOMU(seed, 1000, /NORMAL)*10+50
bsx = 10
bsy = 10
h2d = HIST_2D(xx, yy, BIN1=bsx, BIN2=bsy, $
  MIN1=0, MAX1=100-bsx, MIN2=0, MAX2=100-bsy)
HELP, h2d
PRINT, MIN(h2d), MAX(h2d)

 

사실 뭐 과정이야 어떻든간에 이와 같이 2차원적인 구조를 갖는 배열이면 됩니다. HELP 및 PRINT에 의하여 출력된 내용은 다음과 같습니다. 물론 생성과정에서 난수를 사용하였기 때문에 여러분의 결과는 약간 다를 것입니다.

 

H2D             LONG      = Array[10, 10]
           0         126

 

이러한 2차원 배열을 3차원적인 느낌으로 표출하는 가장 쉬운 방법은 SURFACE 함수를 활용하는 것입니다. 나름 평범하게 구현해본다면 그 과정 및 표출 결과는 다음과 같습니다.

 

win = WINDOW(DIMENSIONS=[600, 600], /NO_TOOLBAR)
sf = SURFACE(h2d, COLOR='gold', /CURRENT)

 

 

그런데 SURFACE 함수의 사용에 있어서 다음과 같이 STYLE 속성의 값을 6으로 설정해주면 마치 레고블록과 같은 형태로 표출할 수 있습니다. 즉 위의 과정에서 SURFACE 함수가 사용된 부분만 다음과 같이 변경해주면 그 결과는 다음과 같습니다.

 

sf = SURFACE(h2d, STYLE=6, COLOR='gold', /CURRENT)

 

 

이 모습을 보면 3차원적인 형태의 막대들로 구성된 "3차원 막대그래프"와 같은 느낌을 줍니다. 그래서 처음에 의도했던 것과 같은 결과를 얻었다고 봐도 될 것 같습니다. 그런데 여기서 조금 더 욕심을 내본다면, 색상들을 다양하게 반영하는 것도 가능할지 궁금해집니다. 즉 3차원 막대들이 다양한 색상들로 구성되도록 하는 방법입니다. 사실 SURFACE 함수에서도 RGB_TABLE 속성이 지원이 됩니다. 그래서 이 속성을 사용하면 가능하지않을까 싶은데, 일단 다음과 같이 COLOR 속성 대신 RGB_TABLE 속성을 적용해봅시다.

 

sf = SURFACE(h2d, STYLE=6, RGB_TABLE=34, /CURRENT)

 

이렇게 해보는 의도는 34번 컬러테이블의 색상들이 배열 h2d의 값에 따라 차등적으로 적용되는 효과를 얻기 위한 것인데요. 다만 이렇게 RGB_TABLE 속성만 활용하는 것만으로는 아무런 효과가 없습니다. 그래서 결과 그림도 제가 아예 첨부하지 않았습니다. 하지만 다행히도 방법이 있습니다. 그 비밀은 바로 VERT_COLORS 속성을 함께 사용하는 것입니다. 즉 다음과 같이 해봅시다.

 

win3 = WINDOW(DIMENSIONS=[600, 600], /NO_TOOLBAR)
sf = SURFACE(h2d, STYLE=6, RGB_TABLE=34, $
  VERT_COLORS=BYTSCL(h2d), /CURRENT)

 

기본적으로 VERT_COLORS 속성에 대해서는 2차원 데이터를 구성하는 각 셀(Cell)마다 지정될 색상값들로 구성된 2차원 배열을 부여하면 됩니다. 색상값들은 RGB_TABLE 속성에 설정된 34번 컬러테이블에 근거하여 실제 색상으로 반영됩니다. 따라서 그 값들은 0~255가 되도록 조절해주는 것이 좋기 때문에 위와 같이 BYTSCL 함수를 사용한 것입니다. 이제 그 결과를 보면 다음 그림과 같습니다.

 

 

이와 같이 특정한 컬러테이블 내의 다양한 색상들로 구성된 3차원적인 막대그래프라고 봐도 될만한 결과를 얻을 수 있습니다. 정리해본다면 2차원 배열 데이터에 대하여 SURFACE 함수를 적용하면서 STYLE, RGB_TABLE, VERT_COLORS 속성들을 함께 사용하면 3차원적인 모습의 막대그래프를 구현할 수 있다는 것을 유념하시면 되겠습니다.

반응형