IDL/New Graphics

플롯상의 각 점들을 서로 다른 색상으로 표출하는 방법 [1]

이상우_IDL 2012. 7. 2. 14:35
728x90

우리가 플롯을 그릴 때 각각의 점(point)을 서로 다른 색상으로 표시하고 싶은 경우가 있을 수 있습니다. 물론 이와 같은 표출방식은 기존의 DG(Direct Graphics) 체계에서도 가능은 하지만, 오늘은 NG(New Graphics) 체계에서의 구현방법부터 소개하기로 합니다. NG체계에서는 플롯을 그릴 때 사용되는 PLOT 함수의 기능들 중 VERT_COLORS라는 속성을 사용하여 구현이 가능합니다. 예를 들기 위하여 다음과 같이 랜덤값들로 이루어진 data라는 1차원 배열을 PLOT 함수로 그려봅시다.


data = RANDOMU(seed, 100) * 10; random values in 0~10 range

p = PLOT(data, SYMBOL='circle', /SYM_FILLED, LINESTYLE=6)


그러면 다음 그림과 같은 모습의 플롯을 얻게 됩니다.

만약 이 플롯상에서 Y축의 값이 3보다 작은 점들만 골라 파란색으로 표현하려면 어떻게 하면 될까요? 여기서 VERT_COLORS라는 속성이 등장합니다. IDL 도움말에도 나와있지만 이 속성에 대해서는 RGB 컬러값들로 이루어진 3xN의 크기를 갖는 배열을 부여하면 됩니다. 따라서 먼저 이 속성에 부여할 vcolors라는 배열을 다음과 같이 먼저 정의합니다.


vcolors = BYTARR(3, N_ELEMENTS(data)); array to contain RGB triples for vert colors


그리고 data 배열상에서 3보다 작은 값을 갖는 경우들을 WHERE 함수로 찾고, 이렇게 찾은 인덱스들을 이용하여 vcolors 배열상의 해당 컬러값을 파란색에 해당되는 RGB값인 [0, 0, 255]로 대체합니다. 이렇게 처리된 vcolors를 VERT_COLORS 속성에 부여하면 됩니다. 그러면 다음 그림과 같은 모습의 플롯을 얻게 됩니다.


ww = WHERE(data LT 3, count); range 1 (~3)

IF count NE 0 THEN FOR i = 0, count-1 DO vcolors[*, ww[i]] = [0, 0, 255]

p.VERT_COLORS = vcolors

그러면 내친김에 3~7의 범위에 대해서는 초록색, 7보다 큰 범위에 대해서는 빨간색을 부여해보는 것도 같은 요령으로 가능하겠지요? 즉, 다음과 같이 각 범위에 해당되는 컬러값들을 vcolors에 대입해준 다음 이를 다시 VERT_COLORS 속성에 부여하면 다음 그림과 같은 결과를 얻을 수 있게 됩니다.


ww = WHERE(data GE 3 AND data LT 7, count); range 2 (3~7)

IF count NE 0 THEN FOR i = 0, count-1 DO vcolors[*, ww[i]] = [0, 255, 0]

ww = WHERE(data GE 7, count); range 3 (7~)

IF count NE 0 THEN FOR i = 0, count-1 DO vcolors[*, ww[i]] = [255, 0, 0]

p.VERT_COLORS = vcolors

p.TITLE = 'Plot with Colored Vertices'

이와 같은 방법을 사용하면 Scatter 플롯 등을 비롯한 각종 플롯상에서 각 포인트의 색상을 다르게 부여함으로써 좀 더 직관적인 가시화가 가능할 것입니다. 여기 소개된 내용을 담은 예제코드도 함께 첨부합니다.


test_plot_vert_colors.pro


test_plot_vert_colors.pro
0.0MB
LIST