2차원 공간상에 흩어져있는 다수의 데이터 포인트들 다양한 색상으로 표출하는 방법에 관한 게시물들(링크 1, 링크 2)을 올렸던 적이 있습니다. 그래서 이러한 방식의 구현을 위하여 SCATTERPLOT 및 BUBBLEPLOT 함수를 사용하는 방법 및 예제들을 다양하게 소개한 바 있는데요. 오늘은 이러한 연장선상에 있는 또 다른 예제들을 소개해보고자 합니다. 먼저 예제 데이터를 생성하는 과정부터 시작하면 다음과 같습니다.
n = 100
x1 = RANDOMU(-1, n)*100
y1 = RANDOMU(-2, n)*100
x2 = RANDOMU(-3, n)*100
y2 = RANDOMU(-4, n)*100
x3 = RANDOMU(-5, n)*100
y3 = RANDOMU(-6, n)*100
여기서는 2차원 공간상에 분포하는 100개의 포인트들로 구성되는 3종의 데이터들 각각의 위치 좌표들인 x1, y1, x2, y2, x3, y3을 가정하였습니다. 이들 각각은 0~100의 범위를 갖는 100개의 값들로 구성됩니다. 따라서 총 300개의 데이터 포인트들이 존재하면서 이들이 3종으로 구분되는 상황이라고 보면 됩니다. 그러면 첫번째 데이터인 x1, y1에 대하여 SCATTERPLOT 함수를 사용하여 표출해봅시다. 이 과정은 다음과 같이 처리합니다.
win = WINDOW(DIMENSIONS=[600, 600], /NO_TOOLBAR)
p1 = SCATTERPLOT(x1, y1, XRANGE=[-10, 110], YRANGE=[-10, 110], $
XTICKLEN=1, YTICKLEN=1, XMINOR=0, YMINOR=0, $
XGRIDSTYLE=1, YGRIDSTYLE=1, $
SYMBOL='circle', /SYM_FILLED, SYM_SIZE=3, SYM_COLOR='red', $
MARGIN=0.1, FONT_SIZE=11, /CURRENT, NAME='data 1')
여기서는 x1, y1 데이터를 붉은색 원형 심볼들로 표시하였으며, 좌표들의 위치 및 심볼들의 크기를 감안하여 X축 및 Y축의 범위에 좀 더 여유를 두었습니다. 또한 점선형의 격자선을 그려주면서 마이너 눈금들은 제거하였습니다. 일단 여기까지의 내용에 의한 표출 결과는 다음 그림과 같습니다.

이제 나머지 데이터들인 x2, y2, x3, y3에 해당되는 포인트들을 각각 다른 색상으로 중첩시켜봅시다. 이를 위하여 다음과 같은 내용을 추가합니다.
p2 = SCATTERPLOT(x2, y2, SYMBOL='circle', /SYM_FILLED, $
SYM_SIZE=3, SYM_COLOR='green', /OVERPLOT, NAME='data 2')
p3 = SCATTERPLOT(x3, y3, SYMBOL='circle', /SYM_FILLED, $
SYM_SIZE=3, SYM_COLOR='blue', /OVERPLOT, NAME='data 3')
lgd = LEGEND(TARGET=[p1, p2, p3], ORIENTATION=1, $
HORIZONTAL_ALIGNMENT=0.5, HORIZONTAL_SPACING=0.06, $
VERTICAL_ALIGNMENT=0.5, VERTICAL_SPACING=0.07, $
SAMPLE_WIDTH=0, LINESTYLE=0, POSITION=[0.5, 0.95], /NORMAL)
여기서는 두번째 데이터가 초록색 그리고 세번째 데이터가 파란색 심볼들로 표시되도록 하였습니다. 그리고 이제는 3종의 데이터들이 혼재된 상황이기 때문에 LEGEND 함수를 사용하여 범례를 상단에 추가하였습니다. 여기서 LEGEND 함수가 사용된 내용이 약간 복잡한데, ORIENTATION 속성을 1로 설정하여 수평 방향이 되도록 하였고 데이터 포인트 심볼이 하나씩만 표시되도록 하기 위하여 SAMPLE_WIDTH 속성을 0으로 설정하였습니다. 그리고 여백 및 위치에 대한 세부 조정을 위하여 수평 및 수직 방향에 대한 _ALIGNMENT 및 _SPACING 속성들의 값을 적절히 설정하였습니다. 여기까지의 내용을 실행한 결과는 다음 그림과 같습니다.

일단 그림 자체는 나쁘지 않은데 나중에 중첩된 데이터 심볼들이 기존에 표시된 심볼들을 덮어쓰는 현상이 좀 거슬립니다. 그래서 이러한 문제에 대한 해결책으로서 심볼들을 반투명으로 처리해보면 어떨까 합니다. 이러한 처리를 위해서는 SCATTERPLOT 함수들 각각에 대하여 TRANSPARENCY 속성을 추가적으로 사용하면 됩니다. 즉 위의 내용에서 SCATTERPLOT 함수가 사용된 부분들만 다음과 같이 변경하면 됩니다.
p1 = SCATTERPLOT(x1, y1, XRANGE=[-10, 110], YRANGE=[-10, 110], $
XTICKLEN=1, YTICKLEN=1, XMINOR=0, YMINOR=0, $
XGRIDSTYLE=1, YGRIDSTYLE=1, $
SYMBOL='circle', /SYM_FILLED, SYM_SIZE=3, SYM_COLOR='red', $
TRANSPARENCY=50, MARGIN=0.1, FONT_SIZE=11, $
/CURRENT, NAME=' data 1')
p2 = SCATTERPLOT(x2, y2, SYMBOL='circle', /SYM_FILLED, $
SYM_SIZE=3, SYM_COLOR='green', TRANSPARENCY=50, $
/OVERPLOT, NAME=' data 2')
p3 = SCATTERPLOT(x3, y3, SYMBOL='circle', /SYM_FILLED, $
SYM_SIZE=3, SYM_COLOR='blue', TRANSPARENCY=50, $
/OVERPLOT, NAME=' data 3')
여기서는 표시되는 모든 심볼들에 대하여 투명도가 50%가 되도록 설정한 것입니다. 이러한 변경사항을 반영하여 다시 실행해보면 그 결과는 다음 그림과 같습니다.

이 그림을 보면 투명도를 적용한 덕분에 심볼들이 가려져서 완전히 보이지 않는 문제가 어느 정도 해결된 것으로 보입니다. 일단 여기서는 SCATTERPLOT 함수를 사용하면서 TRANSPARENCY 속성을 추가적으로 설정해보았는데요. 사실 이와 같은 표출은 BUBBLEPLOT 함수로도 구현이 가능합니다. 만약 위와 같은 표출을 SCATTERPLOT 함수 대신 BUBBLEPLOT 함수로 구현한다면 그 과정은 대략 다음과 같습니다.
win = WINDOW(DIMENSIONS=[600, 600], /NO_TOOLBAR)
p1 = BUBBLEPLOT(x1, y1, XRANGE=[-10, 110], YRANGE=[-10, 110], $
XTICKLEN=1, YTICKLEN=1, XMINOR=0, YMINOR=0, $
XGRIDSTYLE=1, YGRIDSTYLE=1, $
COLOR='red', SIZING=0.4, BORDER=0, TRANSPARENCY=50, $
MARGIN=0.1, FONT_SIZE=11, /CURRENT, NAME='data 1')
p2 = BUBBLEPLOT(x2, y2, COLOR='green', SIZING=0.4, BORDER=0, $
TRANSPARENCY=50, /OVERPLOT, NAME='data 2')
p3 = BUBBLEPLOT(x3, y3, COLOR='blue', SIZING=0.4, BORDER=0, $
TRANSPARENCY=50, /OVERPLOT, NAME='data 3')
lgd = LEGEND(TARGET=[p1, p2, p3], ORIENTATION=1, $
HORIZONTAL_ALIGNMENT=0.5, VERTICAL_ALIGNMENT=0.5, $
VERTICAL_SPACING=0.05, SAMPLE_WIDTH=0, $
LINESTYLE=0, POSITION=[0.5, 0.95], /NORMAL)
여기서는 BUBBLEPLOT 함수의 특성에 맞춰서 COLOR 및 SIZING 속성을 사용하여 색상 및 크기를 설정하고 BORDER 속성을 0으로 설정하여 경계선은 표시되지 않도록 하였습니다. 그 외 나머지 내용은 거의 유사합니다. 이 내용을 실행하면 그 결과는 다음 그림과 같습니다.

이 그림을 보면 앞서 SCATTERPLOT 함수를 사용했던 결과와 거의 유사한 것으로 보입니다. 따라서 이러한 유형의 표출을 위해서는 SCATTERPLOT 또는 BUBBLEPLOT 함수 중 어느 것을 사용해도 무방하다고 봐도 될 것 같습니다. 다만 여기서 한가지 주목할 부분은 바로 LEGEND 함수로 구현된 범례입니다. 지금 BUBBLEPLOT 함수로 구현된 그림에서는 범례에 표시된 심볼들에 대해서도 투명도가 적용된다는 것을 확인할 수 있습니다. 반면 앞서 SCATTERPLOT 함수로 구현했던 그림을 보면 범례의 심볼들에는 투명도가 전혀 반영되어 있지 않습니다. 따라서 방금 실행했던 내용에서는 투명도의 수치가 플롯의 심볼들 뿐 아니라 범례의 심볼들에 대해서도 동일하게 적용된다고 보면 됩니다. 만약 위의 내용에서 투명도 수치인 TRANSPARENCY 속성의 값을 30으로 변경해본다면 그 결과는 다음 그림과 같습니다.

여기서는 투명도의 수치를 낮추었으므로 약간 더 불투명하게 보이게 됩니다. 그러면 이번에는 반대로 투명도의 수치를 70으로 높인다면 더 투명하게 보일텐데 실제로 그 결과를 보면 다음 그림과 같습니다.

따라서 플롯 자체의 심볼들 뿐 아니라 범례의 심볼들까지도 투명도가 반영되도록 하고 싶을 경우에는 BUBBLEPLOT 함수를 사용하면 되고, 굳이 그럴 필요까지는 없을 경우라면 SCATTERPLOT 함수를 사용해도 무방하다고 보면 됩니다.
* 이 글이 도움이 되었다면 게시물에 대하여 공감 버튼(하트 모양) 클릭 및 블로그 구독도 해주시면 더 큰 힘이 됩니다. 감사합니다.
'IDL > New Graphics' 카테고리의 다른 글
| 막대 차트(Bar Chart) 표출하기 (0) | 2025.12.09 |
|---|---|
| BOXPLOT 함수 소개 (0) | 2025.12.03 |
| 2종의 막대 그래프를 서로 붙여서 표출하기 (0) | 2025.11.27 |
| 바코드 형태의 이미지의 표출 및 응용 [2] (0) | 2025.11.17 |
| 바코드 형태의 이미지의 표출 및 응용 [1] (0) | 2025.11.11 |