IDL의 NG 체계에서 지원되는 그래픽 함수들이 여러가지가 있고 저도 이 블로그를 통해서 나름대로 다양하게 소개를 해오고 있습니다. 그런데 그 중에는 아직 여기서 제가 소개해드린 적이 없는 것들이 좀 있는데, BUBBLEPLOT 함수도 그 중 하나입니다. 그래서 오늘은 이 함수에 대하여 소개해보도록 하겠습니다. IDL 도움말에서 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]
이 데이터는 제가 실제 데이터를 가져온 것으로 지난 11월 17일 우리나라의 6개 지역에 대한 일평균 미세먼저 농도값들입니다. 그래서 농도값들은 data, 각 지역별 경도 및 위도 값들은 lons와 lats, 그리고 각 지역별 명칭은 locations라는 배열로 정의되었습니다. 그러면 바탕 지도를 먼저 표출하고 그 위에 이 지점별 데이터를 중첩 표출하는데 있어서 BUBBLEPLOT 함수를 사용해보고자 합니다. 먼저 한반도 영역에 대한 바탕 지도를 표출하는 과정은 다음과 같습니다.
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
이와 같이 기본적인 형태로 지도를 표출해보았습니다. 그러면 바로 여기서 BUBBLEPLOT 함수를 사용해보겠습니다. 먼저 다음과 같이 가장 단순한 방식으로 사용해봅시다.
bpl = BUBBLEPLOT(lons, lats, /OVERPLOT)
그러면 BUBBLEPLOT 함수에 의하여 각 지점별로 마치 버블(Bubble)과 같은 형태들이 표출됩니다. 그 모습은 다음 그림과 같습니다.
이 모습은 사실 6개의 지점들에 대하여 위치별로 버블을 표시하는 가장 기본적인 처리만 된 상태입니다. 여기서 몇가지 부가 기능들을 더 활용해야 하는데, 우선 MAGNITUDE 속성부터 이용해보겠습니다. 위의 BUBBLEPLOT 함수가 사용된 내용에서 다음과 같이 MAGNITUDE 속성을 추가하고 다시 실행해봅시다.
bpl = BUBBLEPLOT(lons, lats, MAGNITUDE=data, /OVERPLOT)
여기서는 MAGNITUDE 속성에 data 배열을 부여함으로써 data 배열 값들의 크기에 따라 버블들의 크기도 비례하여 표출되도록 처리한 것입니다. 그 결과는 다음 그림과 같습니다.
버블들의 전반적인 크기는 SIZING 속성을 이용하여 조정할 수 있습니다. 이 속성의 디폴트 값은 1입니다. 다음과 같이 이 속성을 추가하고 그 값을 1.5로 설정한 경우의 모습은 다음 그림과 같습니다.
bpl = BUBBLEPLOT(lons, lats, MAGNITUDE=data, SIZING=1.5, /OVERPLOT)
그리고 0.7로 설정한 경우의 모습은 다음과 같습니다.
bpl = BUBBLEPLOT(lons, lats, MAGNITUDE=data, SIZING=0.7, /OVERPLOT)
SIZING 속성은 이와 같이 활용하면 됩니다. 이와 같이 데이터 값의 크기에 비례하여 각 버블의 크기로 반영되도록 할 수 있습니다. 색상의 경우는 COLOR 속성을 이용하면 됩니다. 그래서 만약 모든 버블들의 색상을 초록색으로 바꾸려면 다음과 같이 하면 됩니다.
bpl = BUBBLEPLOT(lons, lats, MAGNITUDE=data, SIZING=0.7, $
COLOR='green', /OVERPLOT)
그 결과는 다음 그림과 같습니다.
만약 각 버블마다 색상이 다르게 보이도록 하려면 데이터 갯수와 동일한 갯수의 컬러값들로 구성된 배열을 COLOR 속성에 부여해야 합니다. 예를 들면 다음과 같습니다.
bpl = BUBBLEPLOT(lons, lats, MAGNITUDE=data, $
COLOR=['yellow', 'orange', 'green', 'blue', 'pink', 'red'], /OVERPLOT)
여기서는 버블들이 약간 더 크게 보이도록 하기 위하여 제가 일부러 SIZING 속성을 삭제하고 그냥 디폴트 크기로 처리되도록 하였습니다. 그 결과는 다음 그림과 같습니다. 바로 앞의 그림에서보다는 버블들의 크기가 약간 더 커진 상태입니다.
그리고 SHADED 속성이라는 것도 지원되는데, 다음과 같이 이 속성을 사용하면 버블들이 약간 미끈한 표면 처리가 된 구체와 같은 느낌으로 표출되도록 하는 것도 가능합니다.
bpl = BUBBLEPLOT(lons, lats, MAGNITUDE=data, /SHADED, $
COLOR=['yellow', 'orange', 'green', 'blue', 'pink', 'red'], /OVERPLOT)
그 결과는 다음 그림과 같습니다.
그리고 또 주목해볼만한 속성으로서 EXPONENT 속성이 있는데, MAGNITUDE 속성에 부여된 데이터 값의 크기를 각 버블의 반경으로 반영하는 방식을 제어하는 역할을 합니다. 이 속성의 디폴트 값은 1입니다. 이 경우에는 데이터 값의 크기가 버블의 반경에 비례하도록 처리됩니다. 앞서 표출된 결과들은 모두 이 상태로 크기가 반영된 경우입니다. 만약 다음과 같이 EXPONENT 속성을 추가하고 그 값을 0.5 설정하면 데이터 값의 크기가 버블의 면적에 비례하도록 처리됩니다.
bpl = BUBBLEPLOT(lons, lats, MAGNITUDE=data, /SHADED, $
COLOR=['yellow', 'orange', 'green', 'blue', 'pink', 'red'], $
EXPONENT=0.5, /OVERPLOT)
그 결과는 다음 그림과 같습니다.
버블들의 크기 분포가 앞선 예제들과는 달라졌음을 알 수 있습니다. 크기가 버블의 반경에 비례하도록 처리된 디폴트 상태와 비교해보면, 현재와 같이 크기가 버블의 면적에 비례하도록 처리된 경우에는 버블들 사이의 상대적 크기 편차가 다소 줄어든 모습입니다. 물론 어떤 방식을 따르느냐는 사용자의 결정사항이 될 것입니다.
마지막으로 이번에는 각 버블마다 라벨 문자들을 삽입해보겠습니다. 이를 위해서는 다음과 같이 LABELS 속성을 사용해야 합니다. 이 속성에 대하여 라벨 문자값들로 구성된 배열을 부여하면 됩니다. 우리가 맨 처음에 예제 데이터를 정의할 때 각 지역이 이름을 locations라는 문자값 배열로 정의했으므로 이를 다음과 같이 활용하면 됩니다.
bpl = BUBBLEPLOT(lons, lats, MAGNITUDE=data, /SHADED, $
COLOR=['yellow', 'orange', 'green', 'blue', 'pink', 'red'], $
LABELS=locations, LABEL_FONT_SIZE=10, $
EXPONENT=0.5, /OVERPLOT)
여기서는 LABEL_FONT_SIZE 속성도 함께 사용하여 라벨 문자의 크기를 조정하였습니다. 그 결과는 다음 그림과 같습니다.
사실은 이 그림에서 지점별로 부여된 색상들은 그냥 임의로 정한 것일 뿐 별다른 물리적인 의미는 없습니다. 따라서 다음과 같이 그냥 색상을 일괄적으로 정의하는 것이 더 나을 수도 있을 것 같습니다.
bpl = BUBBLEPLOT(lons, lats, MAGNITUDE=data, /SHADED, $
COLOR='gold', LABELS=locations, LABEL_FONT_SIZE=10, $
EXPONENT=0.5, /OVERPLOT)
그 결과는 다음 그림과 같습니다.
어쨌든 이와 같이 라벨 문자들이 추가되는 경우에는 가독성을 높이기 위하여 문자들의 위치, 폰트크기, 색상 등에 대한 세부 설정이 추가적으로 필요할 수도 있습니다. 이를 위해서는 LABEL_로 시작하는 이름의 다른 속성들까지도 추가적으로 활용하는 것이 필요할 수도 있다는 점을 염두에 두는 것이 좋겠습니다.
이 정도면 BUBBLEPLOT 함수를 사용하여 버블 형태의 플롯을 표출하는 방법에 관하여 충분히 소개가 된 것 같습니다. SCATTERPLOT 함수와 비교해본다면, SCATTERPLOT 함수는 각 지점들을 일정한 기호로 표시하면서 경우에 따라서는 데이터 값 크기를 컬러테이블에 근거하여 색상으로 반영하여 표현하는 방식이 주된 기능이고, BUBBLEPLOT 함수는 각 지점들을 버블 형태로 표시하면서 경우에 따라서는 데이터 값 크기를 버블의 크기로 반영하여 표현하는 방식이 주된 기능이라고 보면 됩니다.
오늘은 여기까지입니다. BUBBLEPLOT 함수의 사용에 관하여 소개할 만한 새로운 내용들이 생기면 여기서 또 다뤄보도록 하겠습니다.
'IDL > New Graphics' 카테고리의 다른 글
벡터장(Vector Field)과 입자 추적(Particle Tracing) [1] (0) | 2021.01.18 |
---|---|
버블 플롯(Bubble Plot)에서 컬러테이블 적용 방법 (0) | 2020.12.11 |
축의 눈금(Tick)에 대한 조정(커스터마이즈) 방법 (2) | 2020.10.21 |
패턴(Pattern)을 이용한 색상 채우기 (0) | 2020.10.13 |
색상을 채운 플롯(Filled Plot)의 표출 [2] (0) | 2020.10.07 |