IDL/New Graphics

SCATTERPLOT3D 함수 소개 및 사용법 예제

이상우_idl 2017. 10. 11. 20:12
728x90
반응형

오늘은 NG 체계에서 지원되는 그래픽 함수들 중 SCATTERPLOT3D 함수에 대하여 알아보고 사용 예제 몇가지를 소개해보기로 하겠습니다. 사실 이 함수를 사용한 다른 예제는 제가 이 블로그에서 다룬 적이 있지만, 이 함수 자체에 집중하여 소개했던 적은 없었던 것 같습니다. 그리고 SCATTERPLOT 함수에 대해서는 제가 예전에 별도의 게시물을 올린 바 있으므로, 여기 New Graphics 카테고리에서 해당게시물의 내용을 참조하시면 됩니다. 오늘 소개할 함수는 SCATTERPLOT이 아니라 SCATTERPLOT3D입니다. 즉 3차원 공간상에서 데이터 포인트들을 표시하는 매우 효과적인 가시화 방법이라고 볼 수 있습니다. 이 함수에 투입되어야 할 입력자료는 XYZ 좌표를 갖고 있는 N개의 데이터 포인트들에 대한 정보가 될 겁니다. 따라서 다음과 같이 예제 입력 데이터를 만들어 보았습니다.


np = 200

x = RANDOMU(seed, np)*9+0.5

y = RANDOMU(seed, np)*9+0.5

z = RANDOMU(seed, np)*9+0.5

val = RANDOMU(seed, np)*100


여기서는 200개의 데이터 포인트들이 있다고 가정하였습니다. 이 데이터 포인트들의 X좌표값들만 모아놓은 것이 x이고, Y 및 Z 좌표값들로 구성된 y 및 z도 같은 방식으로 정의하였습니다. 각각 0.5~9.5 범위내에 존재하는 임의의 실수값이 되도록 하기 위하여 난수 발생 함수인 RANDOMU를 사용하였습니다. 그리고 각 데이터 포인트마다 데이터값이 존재할 수 있습니다. 이러한 경우도 다뤄보기 위하여 별도로 val이라는 배열도 정의하였으며, 그 값의 범위가 0~100이 되도록 하였습니다. 그러면 이제 SCATTERPLOT3D 함수를 사용하여 이 데이터 포인트들을 3차원 XYZ 공간에 표출해봅시다. 그 과정은 다음과 같습니다.


win0 = WINDOW(DIMENSIONS=[800, 600], /NO_TOOLBAR)

scp0 = SCATTERPLOT3D(x, y, z, SYMBOL='circle', /SYM_FILLED, SYM_SIZE=1.5, $

  SYM_COLOR='dodger blue', CLIP=0, AXIS_STYLE=2, MARGIN=0.15, $

  XRANGE=[0, 10], YRANGE=[0, 10], ZRANGE=[0, 10], $

  XTITLE='X Axis', YTITLE='Y Axis', ZTITLE='Z Axis', $

  FONT_SIZE=12, /CURRENT)


위에서 SCATTERPLOT3D 함수가 사용된 방식을 보면, 데이터 포인트들의 XYZ 좌표값들에 해당되는 x, y, z 배열이 필수 인자로 사용되었습니다. 즉, 이 좌표들마다 데이터 포인트를 표시하라는 의미입니다. 물론 그 외에도 많은 속성들이 사용되고 있는데요. 주로 XYZ 축에 대한 설정 및 그림 표출과 관련된 것들입니다. 그리고 각 데이터 포인트를 심볼 형태로 나타내기 위하여 SYMBOL을 비롯한 관련 속성들을 사용해 보았습니다. 여기서는 푸른색을 띈 적당한 크기의 원형 심볼들이 각 데이터 포인트의 위치에 표시되도록 하였는데요. 그 결과는 다음 그림과 같습니다.



이와 같이 SCATTERPLOT3D 함수는 3차원 공간상에 데이터 포인트들을 표시해주는 역할을 합니다. 그런데 이 그림을 보면 아직은 좀 부자연스러운 느낌이 듭니다. 즉 공간은 XYZ 3차원인 반면 각 데이터 포인트에 위치한 심볼들은 평면상의 원의 형태로 표시되어 있어서 뭔가 이질감이 느껴집니다. 이왕이면 심볼들도 뭔가 3차원적인 형태를 띄면 좋을 것 같다는 생각이 강하게 듭니다. 따라서 이 문제를 해결하기 위하여 다음과 같이 SCATTERPLOT3D 함수를 약간 다른 방식으로 사용해 봅시다.


win1 = WINDOW(DIMENSIONS=[800, 600], /NO_TOOLBAR)

scp1 = SCATTERPLOT3D(x, y, z, SYM_OBJECT=ORB(), SYM_SIZE=1.5, $

  SYM_COLOR='dodger blue', CLIP=0, AXIS_STYLE=2, MARGIN=0.15, $

  XRANGE=[0, 10], YRANGE=[0, 10], ZRANGE=[0, 10], $

  XTITLE='X Axis', YTITLE='Y Axis', ZTITLE='Z Axis', $

  FONT_SIZE=12, /CURRENT)


이 내용은 전반적으로 첫번째 예제와 거의 같습니다. 다만 심볼 표시와 관련하여 차이점들이 존재하는데요. SYMBOL 속성을 사용하는 대신 SYM_OBJECT라는 속성을 사용하였습니다. 여기에는 ORB()라는 것을 부여하였는데, 각 데이터 포인트들 평면적인 원형으로 표시하는 대신 3차원적인 구체 폴리곤(Spherical Polygon)의 형태로 표시해주기 위한 것입니다. 그 결과는 다음 그림과 같습니다.



이와 같은 방식으로 표출을 하면 훨씬 더 3차원스러운 결과물을 얻을 수 있습니다. 각 데이터 포인트에 위치한 구체 폴리곤에는 약간의 광원 효과도 들어가기 때문에 입체적인 느낌이 꽤 잘 나타납니다. SYM_SIZE, SYM_COLOR 속성을 적절히 조정하여 크기 및 색상을 조절할 수 있습니다.


여기까지의 예제에서는 모든 데이터 포인트들을 동일한 색상의 심볼로 표시하였습니다. 그러면 이번에는 그 색상들이 각 데이터 포인트의 데이터값에 따라 다르게 나타나도록 해보겠습니다. 이를 위해서는 XYZ 좌표 정보인 x, y, z외에 데이터값들에 해당되는 정보가 추가로 필요합니다. 즉, 앞서 초반부에 정의했던 val이라는 배열이 이제 여기서 등장합니다. 그리고 이러한 표출을 위해서는 좀 특별한 속성이 사용되는데, 바로 MAGNITUDE라는 속성이 그 역할을 합니다. 그 예제는 다음과 같습니다.


win2 = WINDOW(DIMENSIONS=[800, 600], /NO_TOOLBAR)

ct = COLORTABLE(67, /REVERSE)

scp2 = SCATTERPLOT3D(x, y, z, SYM_OBJECT=ORB(), SYM_SIZE=1.5, $

  MAGNITUDE=BYTSCL(val, MIN=0, MAX=100), RGB_TABLE=ct, $

  CLIP=0, AXIS_STYLE=2, MARGIN=0.15, $

  XRANGE=[0, 10], YRANGE=[0, 10], ZRANGE=[0, 10], $

  XTITLE='X Axis', YTITLE='Y Axis', ZTITLE='Z Axis', $

  FONT_SIZE=12, /CURRENT)


바로 이전의 예제에서는 SYM_COLOR 속성을 사용하여 모든 심볼들의 색상을 통일했던 반면, 지금의 예제에서는 SYM_COLOR 속성을 제외시키고 MAGNITUDE 속성이 그 자리를 대신하고 있습니다. 그리고 RGB_TABLE 속성이 사용된 것도 주목해야 합니다. 결국 이 예제에서는 데이터값 범위 0~100에 대하여 그 값들의 차이를 특정 컬러테이블의 색상들을 사용하여 표시하는 것이 가장 중요한 핵심이라고 보면 됩니다. 컬러테이블의 색상들이 제대로 반영되도록 하기 위하여 BYTSCL 함수가 사용된 것도 주목해서 보시기 바랍니다. 그 결과는 다음 그림과 같습니다.



이 그림을 보면 각 데이터 포인트마다의 값에 따라서 색상을 차별화하여 나타내는데 있어서 SCATTERPLOT3D 함수가 꽤 효과적임을 확인할 수 있습니다. 여기서 좀 더 욕심을 낸다면 컬러바를 추가적으로 표출하여, 값에 따른 색상을 잘 확인할 수 있도록 해주는 것도 가능합니다. 그 예제는 다음과 같습니다.


win3 = WINDOW(DIMENSIONS=[800, 640], /NO_TOOLBAR)

ct = COLORTABLE(67, /REVERSE)

scp3 = SCATTERPLOT3D(x, y, z, SYM_OBJECT=ORB(), SYM_SIZE=1.5, $

  MAGNITUDE=BYTSCL(val, MIN=0, MAX=100), RGB_TABLE=ct, $

  CLIP=0, AXIS_STYLE=2, MARGIN=[0.15, 0.25, 0.15, 0.15], $

  XRANGE=[0, 10], YRANGE=[0, 10], ZRANGE=[0, 10], $

  XTITLE='X Axis', YTITLE='Y Axis', ZTITLE='Z Axis', $

  FONT_SIZE=12, /CURRENT)

cb = COLORBAR(POSITION=[0.2, 0.05, 0.8, 0.09], RANGE=[0, 100], $

  TITLE='Value', /BORDER)


이 예제는 바로 이전의 예제와 거의 같은데, 여기에 COLORBAR 함수가 사용되는 부분이 추가되었다는 차이만 있습니다. 물론 원활한 표출을 위하여 그래픽창의 크기 및 그림의 여백을 약간 조정하였다는 점만 더 유념하시면 됩니다. 그 결과는 다음 그림과 같습니다.



아마 이 정도면 3차원적인 분포를 하는 데이터 포인트들을 표출하는데 있어서 SCATTERPLOT3D 함수를 사용하는 전형적인 방법에 대한 충분한 설명이 되었으리라 생각합니다. 여러분들도 이 예제를 잘 참조하셔서 멋진 그림을 만들어보시기 바랍니다.

반응형