IDL/New Graphics

데이터 포인트들을 다양한 색상으로 표출하기 [2]

이상우_idl 2023. 7. 31. 14:46
728x90
반응형

제가 얼마전에 "데이터 포인트들을 다양한 색상으로 표출하기"라는 제목의 게시물을 올린 바 있습니다. 기본적으로는 2차원 공간상에 흩어져있는 다수의 데이터 포인트들이 있고 각 포인트마다 데이터 값이 있을 경우를 가정하고, 이러한 데이터를 2차원 공간상에서 표시하면서 각 포인트마다 데이터 값에 따라 색상을 부여하는 방식으로 표출하는 방법 관한 내용이었습니다. 오늘은 그 연장선에서 한 단계 더 들어가보고자 하는데요. 데이터 포인트들을 다양한 색상으로 표시하면서 윤곽선도 함께 표시되도록 하는 방법에 관하여 알아보고자 합니다.

 

원래 SCATTERPLOT 함수에서는 각 포인트의 윤곽선에 대한 설정은 가능합니다. 특히 SYM_COLOR 속성을 사용하면 각 포인트의 심볼의 윤곽선 색상을 설정할 수 있고 SYM_FILL_COLOR 속성을 사용하면 각 심볼의 내부를 채우는 색상을 설정할 수 있습니다. 그런데 앞서 언급한 기존 게시물에서와 같이, 데이터 포인트들을 다양한 색상들로 표시하기 위하여 SCATTERPLOT 함수와 MAGNITUDE 속성을 함께 사용할 경우에는 SYM_COLOR 및 SYM_FILL_COLOR 속성의 사용이 불가능합니다. 바로 이게 문제를 약간 까다롭게 만드는 요인이 되는데요. 즉 MAGNITUDE 속성을 사용하여 데이터 포인트들의 색상을 다양하게 표시하는 것은 가능하지만, 이와 동시에 각 포인트마다 윤곽선을 일정한 색상으로 처리하지는 못한다는 것입니다. 하지만 그럼에도 불구하고 윤곽선도 표시되도록 하고싶다고 할 경우에는 정공법으로는 안되고 뭔가 우회적인 방법을 사용할 수 밖에 없습니다. 제 생각에는 두가지 정도의 방안이 있을 것 같습니다.

 

일단 첫번째 방법은 일단 SCATTERPLOT 함수와 MAGNITUDE 속성을 사용하여 다양한 색상으로 포인트들을 표시하는 과정을 먼저 진행한 후, 별도로 SCATTERPLOT 함수를 한번 더 사용하면서 윤곽선만 따로 덧그려지게 하는 방법입니다. 그러면 관련 예제를 살펴봅시다. 다음과 같이 100개의 포인트들로 구성된 데이터를 가정하고 표출해보도록 합시다.

 

n = 100
x = RANDOMU(-1, n)*100
y = RANDOMU(-2, n)*100
v = RANDOMU(-3, n)*10

win = WINDOW(DIMENSIONS=[600, 600], /NO_TOOLBAR)
ct = 34
p = SCATTERPLOT(x, y, XRANGE=[0, 100], YRANGE=[0, 100], $
  SYMBOL='circle', /SYM_FILLED, SYM_SIZE=2, $
  MAGNITUDE=BYTSCL(v, MIN=0, MAX=10), RGB_TABLE=ct, FONT_SIZE=11, $
  POSITION=[0.1, 0.15, 0.9, 0.95], /CURRENT)
po = SCATTERPLOT(x, y, SYMBOL='circle', SYM_COLOR='black', SYM_SIZE=2, /OVERPLOT)

cb = COLORBAR(POSITION=[0.2, 0.04, 0.8, 0.09], RGB_TABLE=ct, RANGE=[0, 10])

 

여기서 가상 데이터는 100개의 포인트들로 구성되며 각 포인트의 X좌표값들, Y좌표값들, 데이터값들로 구성된 배열 x, y, v가 생성되었습니다. 표출 과정을 보면 p의 경우는 SCATTERPLOT 함수 및 MAGNITUDE 속성을 사용하여 34번 컬러테이블 기반으로 각 포인트별 값에 따라 0~10의 범위로 바이트스케일링이 된 색상들로 표시되도록 한 것입니다. 여기까지는 이전 게시물의 내용과 유사합니다. 다만 여기서는 SCATTERPLOT 함수를 한번 더 사용하여 검정색 윤곽선으로 처리된 데이터 포인트들이 덧그려지도록 처리하였습니다. 여기까지의 내용을 실행하면 결과는 다음 그림과 같습니다.

 

 

이와 같이 각 포인트들이 다양한 색상으로 표시되면서 윤곽선도 함께 표시된 것을 볼 수 있습니다. 그런데 이 표출 결과를 보면 뭔가 좀 개운치가 않습니다. 잘 보면 서로 가깝게 인접한 포인트들의 윤곽선이 겹쳐져보이는 문제가 발생하는 것이 바로 눈에 띕니다. 이게 은근히 거슬리는데요. 안타깝게도 제가 확인한 바로는, SCATTERPLOT 함수를 사용하는 이 방식에서는 이러한 문제점을 극복할 방법이 없는 것 같습니다. 그렇다면 다른 대안이 있느냐가 궁금한데, 다행히도 괜찮은 대안이 있습니다. 이제 두번째 방법으로 소개하고자 하는 방법인데, 바로 BUBBLEPLOT 함수를 사용하는 방법입니다. 이 BUBBLEPLOT 함수에 관해서는 제가 예전에 관련 게시물을 통하여 소개를 한 바 있으므로 자세한 내용은 이 게시물을 참조하시면 됩니다. 여기서는 다음과 같은 방식으로 활용해봅시다.

 

n = 100
x = RANDOMU(-1, n)*100
y = RANDOMU(-2, n)*100
v = RANDOMU(-3, n)*10

win = WINDOW(DIMENSIONS=[600, 600], /NO_TOOLBAR)
ct = 34
p = BUBBLEPLOT(x, y, XRANGE=[0, 100], YRANGE=[0, 100], $
  COLOR=BYTSCL(v, MIN=0, MAX=10), RGB_TABLE=ct, $
  BORDER=1, LINECOLOR='black', SIZING=0.3, FONT_SIZE=11, $
    POSITION=[0.1, 0.15, 0.9, 0.95], /CURRENT)
cb = COLORBAR(POSITION=[0.2, 0.04, 0.8, 0.09], RGB_TABLE=ct, RANGE=[0, 10])

 

여기서는 먼저 COLOR 및 RGB_TABLE 속성에 주목해야 합니다. BUBBLEPLOT 함수에서는 각 데이터 포인트는 마치 물방울처럼 생긴 버블(Bubble)의 형태로 표시됩니다. 그리고 여기서 COLOR 속성은 각 버블의 내부를 채우는 색상이 됩니다. 다만 각 버블의 색상은 데이터 값에 비례해야 하기 때문에 위와 같이 바이트스케일링 처리를 거친 값이 적용되도록 하였으며, 그 근거가 되는 컬러테이블을 RGB_TABLE 속성에 명시한 것입니다. 그 다음에는 각 버블의 윤곽선을 표시하고 그 색상에 대한 설정을 위하여 BORDER 및 LINECOLOR 속성을 사용하였습니다. 또한 버블들의 크기 설정은 SIZING 속성을 사용하여 설정하였습니다. 표출 결과는 다음 그림과 같습니다.

 

 

이 표출 결과를 잘 보면 이전에 SCATTERPLOT 함수를 사용한 경우와는 달리 인접한 버블들의 윤곽선이 서로 겹쳐보이지 않는다는 것을 확인할 수 있습니다. 물론 보는 관점에 따라 다를 수는 있겠으나 일단 제가 보기에는 이러한 방식이 좀 더 나은 것 같습니다. 참고로 BUBBLEPLOT 함수를 사용하면 각 버블의 색상에 대하여 쉐이딩(Shading)을 적용하는 처리도 가능합니다. 즉 앞서 BUBBLEPLOT 함수가 사용된 부분에서 다음과 같이 /SHADED 속성을 추가하는 것입니다.

 

p = BUBBLEPLOT(x, y, XRANGE=[0, 100], YRANGE=[0, 100], $
  COLOR=BYTSCL(v, MIN=0, MAX=10), RGB_TABLE=ct, /SHADED, $
  BORDER=1, LINECOLOR='black', SIZING=0.3, FONT_SIZE=11, $
    POSITION=[0.1, 0.15, 0.9, 0.95], /CURRENT)

 

이렇게 하면 표출 결과는 다음 그림과 같습니다.

 

 

이와 같이 각 버블의 표면이 매끈하게 보이도록 처리하는 것도 가능합니다. 다만 이렇게 쉐이딩 처리가 될 경우에는 각 버블의 컬러의 톤이 약간 변하기 때문에 하단의 컬러테이블의 색상과 약간 다르게 보일 수 있다는 점을 유의해야 합니다. 어쨌든 BUBBLEPLOT 함수를 사용하면 그 외에도 각 버블의 크기가 데이터 값에 비례하도록 하는 등의 다양한 처리들이 가능한데, 그 자세한 방법에 관해서는 앞서 언급한 관련 게시물의 내용을 참조하시기 바랍니다.

데이터 포인트들을 다양한 색상으로 표출하기

반응형