제가 얼마전에 BUBBLEPLOT 함수를 이용하여 NG 체계에서 버블 플롯(Bubble Plot)을 표출하는 방법에 관하여 소개하는 게시물을 올린 바 있습니다. 이 게시물에서는 나름대로 몇가지 세부 기법들을 소개하고, SCATTERPLOT 함수와 어떤 차이가 있는가에 대해서도 간략히 언급을 했습니다. 그런데 BUBBLEPLOT 함수에 관한 내용에서 약간 의문으로 남는 부분이 있었는데요. 각 버블에 대하여 색상을 지정하는 것은 단일 색상이든 여러 개의 색상들이든 모두 가능하지만, 마치 SCATTERPLOT 함수에서와 같이 특정한 컬러테이블을 기반으로 하여 각 버블의 데이터 값에 따라서 컬러테이블 내의 적절한 색상이 알아서 지정되게 하는 것이 과연 가능할까에 대한 것입니다.
우선 이 이슈에 관한 이해를 돕기 위하여, 지난번 BUBBLEPLOT 함수를 소개했던 게시물에서 사용했던 예제 데이터 및 바탕 지도 표출 과정을 그대로 적용하고, 먼저 BUBBLEPLOT 대신 SCATTERPLOT 함수를 사용하여 표출해보겠습니다. 그 과정은 다음과 같습니다.
locations = ['Seoul', 'Busan', 'Daegu', 'Gwangju', 'Daejon', 'Jeju']
data = [41, 29, 57, 34, 35, 11]
lons = [127.002, 129.056, 128.603, 126.853, 127.385, 126.517]
lats = [37.564, 35.138, 35.872, 35.160, 36.351, 33.500]
win = WINDOW(DIMENSIONS=[500, 600], /NO_TOOLBAR)
m = MAP('Geographic', LIMIT=[33, 124, 40, 131], MARGIN=0.1, /CURRENT)
mc = MAPCONTINENTS(/HIRES)
m.MapGrid.LABEL_POSITION = 0
m.MapGrid.LINESTYLE = 1
m.MapGrid.HORIZON_LINESTYLE = 0
spl = SCATTERPLOT(lons, lats, MAGNITUDE=BYTSCL(data, MIN=0, MAX=60), $
RGB_TABLE=34, SYMBOL='circle', /SYM_FILLED, SYM_SIZE=3, /OVERPLOT)
cb = COLORBAR(TARGET=spl, RANGE=[0, 60], /BORDER, $
POSITION=[0.2, 0.88, 0.8, 0.95])
위 내용의 맨 밑에서 SCATTERPLOT 함수가 사용되었는데, 여기서 MAGNITUDE 및 RGB_TABLE 속성을 적용하여 34번 컬러테이블의 색상들이 데이터 값의 크기에 따라 적절한 간격으로 샘플링되어 각 지점별 원형 기호의 색상으로 반영됩니다. 컬러테이블 내에 있는 색상들이 제대로 반영되도록 하려면 위와 같이 BYTSCL 함수를 사용하여 바이트스케일링 처리된 데이터가 MAGNITUDE 속성에 부여되도록 하는 것이 좋습니다. 여기서는 유효 범위를 0~60으로 정의하였습니다. 즉 원래 데이터 값이 0인 경우에는 컬러테이블의 첫번째 색상과 대응하고 데이터 값이 60인 경우에는 컬러테이블의 마지막 색상과 대응하도록 한 것입니다. 그리고 그래픽 창의 상단 부분에 컬러바가 추가되도록 하였습니다. 위 내용을 실행한 결과는 다음 그림과 같습니다.
그러면 위와 같은 느낌의 표출을 BUBBLEPLOT 함수로도 할 수 있을까요? 결론부터 얘기하자면 가능합니다. 다만 약간의 추가적인 코딩이 필요할 뿐인데 별로 복잡한 것도 아닙니다. 그 내용은 다음과 같습니다.
locations = ['Seoul', 'Busan', 'Daegu', 'Gwangju', 'Daejon', 'Jeju']
data = [41, 29, 57, 34, 35, 11]
lons = [127.002, 129.056, 128.603, 126.853, 127.385, 126.517]
lats = [37.564, 35.138, 35.872, 35.160, 36.351, 33.500]
win = WINDOW(DIMENSIONS=[500, 600], /NO_TOOLBAR)
m = MAP('Geographic', LIMIT=[33, 124, 40, 131], MARGIN=0.1, /CURRENT)
mc = MAPCONTINENTS(/HIRES)
m.MapGrid.LABEL_POSITION = 0
m.MapGrid.LINESTYLE = 1
m.MapGrid.HORIZON_LINESTYLE = 0
bpl = BUBBLEPLOT(lons, lats, MAGNITUDE=data, $
COLOR=BYTSCL(data, MIN=0, MAX=60), RGB_TABLE=34, $
SIZING=0.8, EXPONENT=0.5, /OVERPLOT)
cb = COLORBAR(TARGET=bpl, RANGE=[0, 60], /BORDER, $
POSITION=[0.2, 0.88, 0.8, 0.95])
위의 내용은 바탕 지도의 표출 부분까지는 이전과 같습니다. 다만 이제는 SCATTERPLOT 함수 대신 BUBBLEPLOT 함수가 사용되었습니다. BUBBLEPLOT 함수가 사용된 내용에서 주목할 부분은 바로 COLOR 및 RGB_TABLE 속성들입니다. 우선 RGB_TABLE 속성에서는 사용할 컬러테이블의 번호를 지정합니다. 그리고 COLOR 속성에 대해서는 data 배열에 BYTSCL 함수를 적용하여 바이트스케일링 처리된 데이터가 부여되어 있다는 점이 가장 중요합니다. 결국 각 버블의 색상을 결정하는데 있어서 기본적으로 34번 컬러테이블을 기반으로 하되, 데이터 값의 크기에 따라 컬러테이블 내에서 대응되는 색상값이 사용되도록 한 것입니다. 위 내용을 실행한 결과는 다음 그림과 같습니다.
앞서 SCATTERPLOT 함수를 사용하여 얻었던 그림과 지금 이 그림을 비교해보면 각 지점별 데이터 값에 따라 지정된 색상이 서로 동일함을 알 수 있습니다. 어차피 이번 그림은 BUBBLEPLOT 함수로 구현된 것이므로 이 함수의 다른 기능들도 문제없이 사용할 수 있습니다. 예를 들어 다음과 같이 SHADED 속성을 추가로 사용해보는 것도 가능합니다.
bpl = BUBBLEPLOT(lons, lats, MAGNITUDE=data, $
COLOR=BYTSCL(data, MIN=0, MAX=60), RGB_TABLE=ct, $
SIZING=0.8, EXPONENT=0.5, /SHADED, /OVERPLOT)
결과는 다음 그림과 같습니다.
물론 SHADED 속성을 사용했으므로 각 버블은 매끈하고 입체적인 모습을 띄긴하지만, 사실 이렇게 처리하는 것은 그리 바람직하지는 않을 것 같습니다. 그 이유는 Shading 처리가 적용되면서 색깔도 약간 변하기 때문에, 상단의 컬러바에서 보이는 색상과 차이가 발생하기 때문입니다. 어쩌면 이런 경우에는 컬러바를 아예 제거하는 것이 나을 수도 있습니다.
결과적으로 오늘은 결국 지점별 데이터를 표출하는데 있어서 SCATTERPLOT 함수를 사용하는 경우와 BUBBLEPLOT 함수를 사용하는 경우를 서로 비교해본 셈입니다. 어떤 방식을 택할 것인가는 전적으로 프로그래머의 선택입니다. 두 함수의 기능을 간단하게 비교 정리해본다면 다음과 같습니다.
* SCATTERPLOT : 각 지점을 다양한 기호로 표시하고 지점별 값을 색상으로 대응시키는 것도 가능
* BUBBLEPLOT : 각 지점을 원형 버블 형태로 표시하고 지점별 값을 버블의 크기로 대응시켜 표출 (색상으로 대응시키는 것도 가능)
'IDL > New Graphics' 카테고리의 다른 글
벡터장(Vector Field)과 입자 추적(Particle Tracing) [2] (0) | 2021.01.26 |
---|---|
벡터장(Vector Field)과 입자 추적(Particle Tracing) [1] (0) | 2021.01.18 |
BUBBLEPLOT 함수 소개 (0) | 2020.12.09 |
축의 눈금(Tick)에 대한 조정(커스터마이즈) 방법 (2) | 2020.10.21 |
패턴(Pattern)을 이용한 색상 채우기 (0) | 2020.10.13 |