IDL의 가장 최신 버전인 8.2.2에서는 SCATTERPLOT, SCATTERPLOT3D라는 그래픽 함수들이 추가되어 있습니다. 함수의 이름에서 짐작할 수 있듯이 산포도(Scatter Plot)를 2차원 및 3차원으로 그릴 수 있도록 해줍니다. 오늘은 SCATTERPLOT 함수를 2차원 산포도를 그리는 예제를 다뤄보기로 하겠습니다. 기본적으로 2차원 산포도를 그리기 위해서는 점들의 X, Y축 좌표가 필요합니다. 그리고 각 점이 특정한 값을 갖는 경우도 있습니다. 예를 들면, 특정한 경도 및 위도를 갖는 지점에서의 기온이 몇 도인가를 나타내는 자료와 같은 경우가 되겠죠. 그래서 예제용 자료를 다음과 같은 형태로 제가 임의로 만들어보았습니다. 그냥 조촐하게 점 5개만 표시하는 것으로 하겠습니다.
xx = [1, 3, 5, 7, 9]
yy = [1, 3, 5, 7, 9]
vv = [13, 79, 220, 467, 784]
이 예제 자료를 SCATTERPLOT 함수에 다음과 같은 방식으로 적용해보았습니다. 이 함수에 대한 자세한 내용은 IDL 도움말을 참조하시면 됩니다.
scp = SCATTERPLOT(xx, yy, SYMBOL='square', SYM_SIZE=1.5, /SYM_FILLED, MAGNITUDE=BYTSCL(vv, MIN=0, MAX=1000), $
RGB_TABLE=67)
scp.XTITLE = 'X Axis'
scp.YTITLE = 'Y Axis'
scp.TITLE = 'Scatter Plot Example'
여기서는 X, Y 좌표에 해당되는 두 배열을 기본 인자로 사용하고, 기타 부가적인 속성들을 사용하여 그림의 세부적인 특성을 조정하였는데요. 먼저 심볼의 형태는 SYMBOL 속성을 사용하여 사각형으로 정의하였습니다. 물론 이외에도 다양한 형태의 심볼들이 지원됩니다. SYM_SIZE 속성은 심볼의 크기를 결정합니다. 그리고 SYM_FILLED 속성을 사용하면 심볼의 내부를 색으로 채우라는 의미입니다. 이 때 어떤 색상을 사용할 것이냐가 관건이 됩니다. 가장 기본적인 설정은 검정색으로 채우는 것인데, 물론 이 예제에서는 이것만으로는 충분하지 않을겁니다. 우리가 원하는 것은 각 점마다의 값에 따라 해당되는 색상으로 채워지도록 하는 것입니다.
이렇게 하려면 먼저 RGB_TABLE 속성을 사용하여 어떤 컬러테이블을 사용할 것인지를 먼저 결정해야 합니다. 여기서는 67번 컬러테이블을 사용해보았습니다. 그리고 예제 자료에서 각 점마다의 값은 vv라는 배열로 되어 있는데, 이 값들의 범위를 보면 최소 13부터 최대 784까지로 되어 있습니다. 그래서 이 컬러테이블에 있는 0~255의 컬러인덱스 범위가 자료값의 최소~최대 범위에 대응하도록 하기 위하여 MAGNITUDE라는 속성을 사용하였습니다. 원래는 이 속성에 그냥 vv를 부여하면 되긴 합니다. 다만 여기서는 제가 값의 범위를 0~1000에 맞추도록 일부러 조정해보았습니다. 즉, 실제 값의 범위는 13~784이긴 하지만, 색상 표현을 위한 값의 범위를 0~1000으로 맞춘 것입니다. 이를 위하여 BYTSCL 함수를 사용하여 vv의 범위를 0~1000으로 재조정한 결과가 MAGNITUDE 속성에 부여되도록 하였습니다. 그리고 기타 축 타이틀 및 전체 타이틀 문자 등을 설정한 후, 이와 같이 구현된 산포도의 모습은 다음 그림과 같습니다.
그런데 표현되는 색상이 밝은 경우에는 각 점에 해당되는 심볼이 눈에 잘 띄지 않는 경우도 있습니다. 이럴 경우에는 윤곽선만으로 된 심볼을 중첩하여 그려주면 더 좋습니다. 그래서 다음과 같이 SCATTEPLOT 함수를 한번 더 사용해보았습니다. 여기서는 OVERPLOT 속성을 사용하였고, 심볼을 그릴 때 색을 채우지는 않도록 하여, 검정색 윤곽선만 그려지도록 처리하였습니다. 그 결과는 다음 그림과 같습니다. 윤곽선이 보이니까 가독성은 더 좋아진 셈입니다.
scp_over = SCATTERPLOT(xx, yy, SYMBOL='square', SYM_SIZE=1.5, /OVERPLOT)
좀 더 욕심을 낸다면 여기에 컬러바를 추가하는 것이 좋을 것입니다. 그래서 산포도의 오른쪽에 세로 방향의 컬러바를 삽입해보려고 하는데요. 이를 위해서는 플롯이 차지하는 공간을 재조정할 필요가 있습니다. 그래서 다음과 같이 산포도의 POSITION 속성을 재설정하면 오른쪽에 여백 공간을 마련할 수 있습니다. 이 속성에 들어가는 4개의 값은 그림이 차지할 사각형 영역의 X1, Y1, X2, Y2 좌표를 Normalized 좌표(0~1)로 나타낸 것입니다.
scp.POSITION = [0.10, 0.10, 0.80, 0.90]
그리고 다음과 같이 COLORBAR 함수를 사용하여 컬러바를 생성합니다. 여기서 사용된 각 속성에 대해서는 COLORBAR에 관한 도움말을 참조하시기 바랍니다. 물론 컬러바 역시 POSITION 속성으로 위치를 조정할 수 있기 때문에, 다음과 같이 적당한 좌표값으로 설정하면 됩니다. 이렇게 해서 나온 결과 그림은 아래와 같습니다.
cbar = COLORBAR(ORIENTATION=1, RGB_TABLE=67, RANGE=[0, 1000], TITLE='Value')
cbar.POSITION = [0.93, 0.20, 0.98, 0.80]
3차원 산포도를 그리는 SCATTERPLOT3D의 경우도 차원만 하나 늘어났을 뿐 사용법은 거의 유사합니다. 어쨌든 이와 같은 그래픽 함수들을 사용하면 산포도 그림을 아주 깔끔하게 얻을 수 있습니다. 최종 결과물을 그림으로 저장하려면 다음과 같이 SAVE 메서드를 사용하면 됩니다. 여기서는 PNG 형식의 그림파일로 저장해보았습니다.
scp.Save, 'scatterplot.png', RESOLUTION=96
'IDL > New Graphics' 카테고리의 다른 글
VOLUME 함수의 활용 [2] (0) | 2013.07.11 |
---|---|
VOLUME 함수의 활용 [1] (0) | 2013.07.09 |
NG 체계에서 특수문자의 사용법 (0) | 2013.05.15 |
CONTOUR 함수에서 라벨 문자 변경하기 (0) | 2013.05.09 |
IDL로 해보는 신년인사 (0) | 2013.01.03 |