IDL/Direct Graphics

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

이상우_idl 2012. 7. 27. 16:18
728x90
반응형

IDL에서 플롯상의 점들을 서로 다른 색상으로 표출하는 방법을 지난번에는 NG 체계의 방식으로 소개했었습니다. 오늘은 DG 체계에서의 방식을 소개해보기로 하겠습니다. 먼저 예제로 사용하기 위한 x, y 자료들을 다음과 같이 랜덤함수로 생성하고 표출을 위한 그래픽창도 띄웁니다. 여기서 생성된 예제 데이터는 x, y 모두 0~10의 범위를 갖습니다.


DEVICE, DECOMPOSED=0

WINDOW, XSIZE=400, YSIZE=300

x = RANDOMU(-1, 20)*10

y = RANDOMU(-1, 20)*10


이렇게 생성된 데이터들이 플롯상에서 선으로 이어지지않고 점으로만 표시되도록 하려면, 다음과 같이 PLOT, PLOTS 두 명령을 순차적으로 사용하는 것이 바람직합니다. 그러면 다음 그림과 같은 결과를 얻을 수 있습니다. 일단 여기서는 모든 점들을 일괄적으로 검정색의 마름모꼴 심볼로 표시하였습니다.


PLOT, x, y, /NODATA, COLOR=0, BACKGROUND=255

PLOTS, x, y, PSYM=4, COLOR=0



물론 PLOT 명령을 쓰면서 PSYM 키워드를 사용하면 하나의 명령으로도 표출은 됩니다. 하지만 플롯상의 점들을 차후 다른 색상들로 표출하는 작업을 위해서는, 일단 PLOT 명령으로는 X, Y 축만 그려놓고 실제 데이터는 나중에 PLOTS로 표출하는 것이 좋습니다. 참고로 PLOTS라는 명령은 쉽게 생각하면 PLOT의 기능에서 축 생성 및 설정 등의 기능이 빠진 것이라고 보면 됩니다.


이 그림에서는 플롯상의 모든 점들이 모두 일괄적으로 검정색의 마름모꼴 심볼로 표시되어 있습니다. 그런데 만약 다음과 같이 x, y를 이용하여 생성된 z라는 데이터가 있어서, 이 z라는 데이터의 값에 따라 각 점을 서로 다른 색상으로 표출하고 싶다고 합시다.


z = x + y


여기서의 z는 x와 y를 더한 결과값이므로 대략 0~20의 범위를 갖게 됩니다. 그런데 COLOR 키워드에 부여할 수 있는 색상의 값은 0~255의 범위입니다. 그래서 z의 값에 해당되는 색상값을 계산하는 과정이 필요합니다. 그리고 이 값에 따라서 그 x, y에 해당되는 점을 PLOTS 명령을 사용하여 개별적으로 표시해주면 됩니다. 다만 이러한 일련의 과정들은 반복문을 사용해야 합니다. 그래야만 각 점에 개별적으로 고유의 색상을 부여할 수 있습니다. 이와 같은 과정을 다음과 같이 반복문의 형태로 구현할 수 있습니다. 참고로 여기서는 39번 컬러 테이블을 사용하였습니다.


LOADCT, 39

FOR i = 0, N_ELEMENTS(z)-1 DO BEGIN

  cc = 255./20*z[i]

  PLOTS, x[i], y[i], PSYM=4, COLOR=cc

ENDFOR


그러면 다음 그림과 같이 각 점의 심볼의 색상이 z의 값에 따라 다양한 색상으로 표출됩니다.



이로서 소기의 목적은 달성한 셈이지만 뭔가 좀 아쉬운 느낌이 듭니다. 사실 PLOT이나 PLOTS에서 PSYM 키워드를 사용하여 심볼의 형태로 표출하는데 있어서는 몇가지 제약이 있습니다. 우선 심볼의 형태가 제한적이고(원형도 없음), 심볼의 내부를 색으로 채워주는 기능도 빠져있습니다. 물론 NG 체계에서는 이러한 제약이 없지만 DG 체계에서는 엄연히 존재하는 부분입니다. 물론 USERSYM이라는 기능이 제공은 되는데 이 기능을 사용하려면 심볼의 형태 자체를 사용자가 일일이 정의해줘야 한다는 귀찮음이 있습니다.


그래서 이러한 귀찮음을 겪지 않고도 위의 제약사항들을 어느 정도 극복할 수 있도록 해주는 PLOTSYM이라는 루틴을 소개합니다. 이 루틴은 원래 IDL Astro 라이브러리에서 제공됩니다. 따라서 혹시 이 라이브러리를 설치하여 사용중인 경우에는 IDL에서 이 루틴을 바로 사용할 수 있고, 혹시나 라이브러리가 설치안된 경우라면 그냥 이 소스 프로그램만 가져다 사용할 수도 있습니다. 이 루틴의 소스파일은 이 글에 첨부해놓겠습니다. 그래서 이 루틴을 사용하여 앞서 등장했던 반복문을 다음과 같이 살짝 수정해보았습니다.


FOR i = 0, N_ELEMENTS(z)-1 DO BEGIN

  cc = 255./20*z[i]

  PLOTSYM, 0, 1.5, /FILL

  PLOTS, x[i], y[i], PSYM=8, COLOR=cc

ENDFOR


이렇게 수정된 반복문을 실행하여 얻은 결과는 다음 그림과 같습니다. 여기서 사용된 PLOTSYM 명령의 인자들을 보면, 첫번째 인자는 형태를 결정하는 고유번호(0=원형)이고 두번째 인자는 심볼의 크기(디폴트=1)입니다. 그리고 /FILL 키워드를 사용하면 심볼의 내부를 색상으로 채워넣으란 의미입니다. 이렇게 정의된 심볼을 나중에 PSYM 기워드의 값을 8로 설정하여 사용할 수 있습니다. 참고로PLOTSYM 명령의 자세한 사용법은 소스 프로그램의 주석문에 상세히 나와 있습니다. 어쨌든 이와 같이 원형의 심볼을 적당한 크기로 설정해놓고 그려진 결과입니다.



만약 여기서 좀 더 욕심을 부려서, 심볼 자체의 색상은 이렇게 표시하되 심볼의 경계선은 검정색으로 처리하여 가독성을 높이고 싶다면 다음과 같이 PLOTSYM, PLOTS를 두 번에 걸쳐 사용할 수도 있습니다. 여기서는 한번은 색상을 채워서 그리고 바로 이어서는 색상을 안채우고 경계선만 검정색으로 처리하는 방식을 사용하였으며, 그 결과는 다음 그림과 같습니다.


FOR i = 0, N_ELEMENTS(z)-1 DO BEGIN

  cc = 255./20*z[i]

  PLOTSYM, 0, 1.5, /FILL

  PLOTS, x[i], y[i], PSYM=8, COLOR=cc

  PLOTSYM, 0, 1.5

  PLOTS, x[i], y[i], PSYM=8, COLOR=0

ENDFOR


이와 같이 DG 체계에서도 플롯상의 점들을 다양한 색상으로 나타내는 표출이 가능합니다.

plotsym.pro
0.0MB
plotsym.pro
0.0MB
반응형