2차원 공간상에 흩어져있는 다수의 데이터 포인트들이 있고 각 포인트마다 데이터 값이 있을 경우를 가정하고, 이러한 데이터를 2차원 공간상에서 표시하면서 각 포인트마다 데이터 값에 따라 색상을 부여하는 방식으로 표출하는 방법에 관하여 살펴보고자 합니다. 사실 이러한 주제의 게시물들을 제가 예전에 두어번 정도 올린 적이 있기는 하지만 이번에 새롭게 다시 정리를 해보고자 합니다. 일단 가상의 데이터를 다음과 같이 생성해봅시다.
n = 1000
x = RANDOMU(-1, n)*100
y = RANDOMU(-2, n)*100
v = RANDOMU(-3, n)*10
여기서는 1000개의 데이터 포인트들을 가정하고, 각 포인트에 대한 X 좌표, Y 좌표 및 데이터값에 해당되는 배열인 x, y, v를 생성한 것입니다. 이렇게 하면 X축 및 Y축 방향으로 0~100의 범위의 좌표가 되고 각 포인트의 데이터 값은 0~10의 범위를 갖게 됩니다. 이제 2차원 공간상에서 이 데이터 포인트들을 표출하기 위하여 다음과 같이 SCATTERPLOT 함수를 활용해봅시다.
p = SCATTERPLOT(x, y, SYMBOL='circle', /SYM_FILLED, $
MARGIN=0.1, FONT_SIZE=11, /CURRENT)
여기서는 일단 모든 점들을 동일한 색상으로 일괄적으로 표시하였습니다. 표출된 모습은 다음 그림과 같습니다.
이제 각 점들의 색상이 데이터 값 즉 v의 값과 연동되도록 해봅시다. 이를 위해서는 MAGNITUDE 및 RGB_TABLE 속성을 활용하면 됩니다. 따라서 앞서 SCATTERPLOT 함수가 사용된 내용을 다음과 같이 변경해봅시다.
p = SCATTERPLOT(x, y, SYMBOL='circle', /SYM_FILLED, $
MAGNITUDE=BYTSCL(v, MIN=0, MAX=10), RGB_TABLE=34, $
MARGIN=0.1, FONT_SIZE=11, /CURRENT)
이와 같이 MAGNITUDE 속성에 v를 부여하면 v의 값에 따라서 각 점의 색상이 차등적으로 적용됩니다. 이 색상의 근거가 되는 컬러테이블은 RGB_TABLE 속성에서 설정합니다. 다만 이 때 MAGNITUDE 속성에 v를 직접 부여하기보다는 위와 같이 BYTSCL 함수를 한번 거쳐주는 것이 좋습니다. 이렇게 하면 데이터 값의 범위를 0~10으로 명확히 정의하면서 34번 컬러테이블의 색상들도 최소값인 0부터 최대값인 10까지 모든 색상들이 제대로 매칭이 될 것입니다. 이와 같이 표출한 결과는 다음 그림과 같습니다.
그런데 이러한 표출을 할 때에는 컬러바도 함께 표시하는 것이 좋을 것입니다. 따라서 이번에는 전체적인 그림의 위치를 약간 위로 옮기면서 하단에 컬러바도 추가해봅시다. 이를 위하여 SCATTERPLOT 함수의 내용을 다음과 같이 약간 변경하고, 컬러바 표시를 위하여 COLORBAR 함수를 추가적으로 사용해봅시다.
p = SCATTERPLOT(x, y, SYMBOL='circle', /SYM_FILLED, $
MAGNITUDE=BYTSCL(v, MIN=0, MAX=10), RGB_TABLE=34, FONT_SIZE=11, $
POSITION=[0.1, 0.15, 0.9, 0.95], /CURRENT)
cb = COLORBAR(POSITION=[0.2, 0.04, 0.8, 0.09], RANGE=[0, 10], RGB_TABLE=34)
여기서는 COLORBAR 함수를 사용할 때 RANGE 및 RGB_TABLE 속성을 함께 사용해야 한다는 것을 유의해야 합니다. 사실 다른 그래픽 함수들(IMAGE, CONTOUR 등)로 작업할 때에는 저렇게까지 할 필요가 없는 경우도 많습니다. 왜냐하면 이러한 그래픽 함수들로 표출된 데이터는 컬러테이블과 바로 연동이 되기 때문입니다. 하지만 이번 예제와 같이 SCATTERPLOT 함수를 사용하면서 MAGNITUDE 속성으로 각 점들을 색상을 차등적으로 표시하는 경우에는, MAGNITUDE 속성에 대응된 데이터가 컬러테이블로 바로 연동되지 않습니다. 따라서 이와 같이 컬러바를 그냥 독립적으로 만든다는 느낌으로 생성해주는 것이 확실한 방법이 됩니다. 어쨌든 위와 같은 과정을 거쳐 표출된 결과는 다음 그림과 같습니다.
그리고 컬러테이블의 사용에 있어서 이와 같이 연속적인 색상분포를 하는 경우 외에도 불연속적인 색상분포를 하는 컬러테이블을 사용해보는 것도 가능합니다. 다만 이를 위해서는 제가 예전에 소개했던 CTABLE_DISCRETE 함수를 사용해야 하는데요. 다만 이 기능은 IDL에 기본 탑재된 것이 아니기 때문에 해당 게시물의 링크를 통해서 따로 받아서 사용해야 합니다. CTABLE_DISCRETE 함수에 관한 자세한 내용은 이 게시물의 내용을 참조하시면 됩니다. 어쨌든 이러한 방식의 표출을 위한 과정은 다음과 같습니다.
ct = CTABLE_DISCRETE(['blue', 'green', 'gold', 'red'], [0, 2, 4, 7, 10])
p = SCATTERPLOT(x, y, SYMBOL='circle', /SYM_FILLED, $
MAGNITUDE=BYTSCL(v, MIN=0, MAX=10), RGB_TABLE=ct, FONT_SIZE=11, $
POSITION=[0.1, 0.15, 0.9, 0.95], /CURRENT)
cb = COLORBAR(POSITION=[0.2, 0.04, 0.8, 0.09], RGB_TABLE=ct, $
RANGE=[0, 10], TICKVALUES=[0, 2, 4, 7, 10])
여기서는 데이터 값 범위의 세부 구간들을 0~2, 2~4, 4~7, 7~10으로 나누고 각 구간별 색상을 위와 같이 설정하였습니다. 그리고 하단에 표시될 컬러바에서도 이러한 특성이 동일하게 반영될 수 있도록 하기 위하여 COLORBAR 함수의 TICKVALUE 속성을 추가적으로 사용하였습니다. 결과는 다음 그림과 같습니다.
따라서 2차원 공간상에 분포하는 다수의 데이터 포인트들에 대하여 값에 따라 색상을 차등적으로 적용하여 표출하고자 할 경우에는 대략 이와 같은 요령으로 처리를 하면 되지않을까 합니다.
'IDL > New Graphics' 카테고리의 다른 글
데이터 포인트들을 다양한 색상으로 표출하기 [2] (0) | 2023.07.31 |
---|---|
Refresh 메서드를 활용한 표출 시간 절약법 (0) | 2023.07.26 |
3차원 공간상에서 지도와 타 그래픽 요소의 중첩 표출 [2] (0) | 2023.03.13 |
3차원 공간상에서 지도와 타 그래픽 요소의 중첩 표출 [1] (0) | 2023.03.08 |
서피스(Surface) 그림의 이동 (0) | 2023.03.02 |