IDL/Direct Graphics

DG 체계에서 컬러바를 직접 제작하기

이상우_idl 2023. 9. 18. 15:16
728x90
반응형

IDL에서 컬러바(Colorbar)를 표시하는 방법에 관해서는 예전에 한번 관련 게시물을 통하여 소개를 한 바 있습니다. 이 게시물에서도 언급하였듯이 원래 IDL의 DG(Direct Graphics) 체계에서는 컬러바의 표시를 위한 명령이라 할 만한 것이 딱히 있지는 않습니다. 그래서 Coyote 라이브러리에 있는 COLORBAR 프로시저를 따로 받아서 사용하는 것이 일반적인 해결책이었습니다. 다만 IDL에 NG(New Graphics) 체계가 도입되면서 동일한 이름으로 NG 체계의 COLORBAR 함수가 지원되기 시작하면서 서로 이름이 중복되는 문제가 발생하였기 때문에, Coyote 라이브러리의 COLORBAR 프로시저를 이름만 COLORBAR_COYOTE 프로시저로 바꿔서 소개를 한 것이 바로 앞서 언급한 게시물의 주요 내용이었습니다. 따라서 IDL의 DG 체계에서의 컬러바 표시를 편리하게 하려면 이 COLORBAR_COYOTE 프로시저를 사용하면 웬만큼은 해결이 됩니다. 참고로 COLORBAR_COYOTE의 소스코드 파일은 그 게시물에도 첨부되어 있지만 여기에도 첨부해둡니다.

 

colorbar_coyote.pro
0.02MB

 

그런데 DG 체계에서 COLORBAR_COYOTE 프로시저를 사용하더라도 약간 난감한 이슈가 있습니다. 컬러바에 반영될 색상들 즉 컬러테이블과 관련된 것인데요. 구체적으로 어떤 이슈인지부터 먼저 살펴보겠습니다. 이를 위하여 가상의 2차원 데이터를 이미지로 표출하면서 컬러바를 하단에 함께 표시하는 예제를 사용하고자 합니다. 그래서 가상의 2차원 데이터를 생성하고 표출을 위한 그래픽창을 셋업하는 과정부터 보면 다음과 같습니다.

 

data = HANNING(600, 600)*100
add = FLTARR(600, 600)
add[300, 300] = HANNING(300, 300)*50
data = data+add
PRINT, MIN(data), MAX(data)

DEVICE, DECOMPOSED=0
WINDOW, XSIZE=600, YSIZE=700
LOADCT, 0
ERASE, 255

 

여기서 생성된 가상 데이터는 600x600의 2차원 데이터이고 값 범위는 0~100입니다. 이 데이터를 이미지로 표출하고 그 밑에 컬러바를 표시하기 위하여 그래픽창은 세로 방향으로 좀 더 길게 설정하였고, 그래픽창 자체는 배경색이 흰색이 되도록 하였습니다. 이 상태에서 이제 이미지를 표출하고 컬러바를 삽입해봅시다. 여기서는 먼저 5번 컬러테이블을 사용하기로 합니다.

 

LOADCT, 5
TVSCL, data, 0
COLORBAR_COYOTE, POSITION=[0.1, 0.04, 0.9, 0.09], DIVISIONS=5, $
  MINRANGE=MIN(data), MAXRANGE=MAX(data), MINOR=0, FORMAT='(F0.1)', $
  COLOR=0, TITLE='data value'

 

이와 같이 5번 컬러테이블을 불러오고 TVSCL 명령으로 이미지를 표시한 다음 COLORBAR_COYOTE 명령을 사용하여 하단부에 컬러바가 표시되도록 하였습니다. 여기까지의 과정에 의하여 표출된 결과는 다음과 같습니다.

 

 

이 표출 그림만 보면 사실 별다른 문제는 보이지 않는 것 같습니다. 그런데 다른 컬러테이블을 사용할 경우에는 약간 상황이 미묘해지는데요. 이번에는 34번 컬러테이블을 사용해봅시다. 즉 위에서 LOADCT 명령만 다음과 같이 변경합니다.

 

LOADCT, 34

 

이 경우의 표출 결과를 보면 다음 그림과 같습니다.

 

 

이 그림에서는 뭔가 개운치않은 느낌이 살짝 전해지는 것 같은데요. 문제점을 좀 더 극명하게 나타내기 위하여 커스텀 컬러테이블을 생성하여 적용해보겠습니다. 이를 위해서는 LOADCT 명령이 사용된 부분을 다음과 같은 내용으로 대체하면 됩니다.

 

ct = COLORTABLE(['orange', 'red', 'dark red'])
TVLCT, ct

 

이와 같이 COLORTABLE 함수를 사용하여 붉은색 계열의 3종 색상들로만 구성된 커스텀 컬러테이블을 생성하고 TVLCT 명령을 사용하여 이 컬러테이블을 적용하는 것입니다. 표출 결과를 보면 다음과 같습니다.

 

 

아마 이 그림을 보면 무엇이 문제인지 좀 더 확실히 드러나는 것 같습니다. 바로 컬러바와 함께 표시되는 문자들 및 선의 색상인데요. COLORBAR_COYOTE 명령에서는 이러한 요소들에 대한 색상을 COLOR 키워드로 설정할 수는 있습니다. 다만 이 키워드에는 0부터 255 사이의 값을 부여하면 되는데, 이 얘기는 현재 활성화된 컬러테이블을 구성하는 색상들 중 하나가 사용된다는 의미입니다. 그런데 방금 본 예제에서는 COLOR 키워드에 0이란 값이 부여되어있고 컬러테이블에서는 0번 색상이 오렌지색이기 때문에 컬러바와 함께 표시되는 선 및 문자들이 모두 이 색상으로 표시됩니다. 그런데 가독성 측면에서 보면 여기서는 오렌지색 대신 그냥 검정색으로 표시하는 것이 더 좋을 것 같습니다.

 

따라서 컬러바 자체는 저렇게 표시를 하면서 선 및 문자들만 검정색으로 표시를 하는 것이 가능할까요? 즉 컬러테이블을 구성하는 색상들과 컬러바의 선 및 문자들을 표시하는 색상을 독립적으로 설정할 수 있느냐의 문제라고 볼 수 있습니다. 사실 여기서는 그게 좀 난감합니다. 현재 활성화된 컬러테이블 내에는 검정색이 존재하지 않기 때문입니다. 그렇다고 검정색이 포함된 다른 컬러테이블을 불러올 수도 없는 노릇입니다. 고육지책으로 현재의 컬러테이블 내에 검정색을 일부러 끼워넣는 방법도 생각해볼 수는 있습니다. 즉 다음과 같은 방식으로 처리하는 것입니다.

 

ct = COLORTABLE(['orange', 'red', 'dark red'])
TVLCT, ct

TVSCL, data, 0
TVLCT, 0, 0, 0, 0

COLORBAR_COYOTE, POSITION=[0.1, 0.04, 0.9, 0.09], DIVISIONS=5, $
  MINRANGE=MIN(data), MAXRANGE=MAX(data), MINOR=0, FORMAT='(F0.1)', $
  COLOR=0, TITLE='data value'

 

이와 같이 데이터 이미지에 커스텀 컬러테이블을 적용한 직후 컬러테이블의 0번 색상만 검정색으로 바꿔치기하여 컬러바 표시에만 적용하는 방법인데요. 다만 이렇게 할 경우에는 그 검정색의 영향이 살짝이나마 드러나게 됩니다. 실제로 표출 결과를 보면 다음과 같습니다.

 

 

전반적으로 나쁘지 않아 보일 수도 있지만, 하단의 컬러바에서 맨 왼쪽을 보면 세로 방향의 검은 선이 추가된 것 같은 모습이 보입니다. 컬러테이블의 0번 색상이 검정색으로 대체된 상태이기 때문입니다. 물론 이 방식도 나름의 해결책으로 볼 수도 있긴 하지만 좀 더 깔끔한 해결책은 없을까요? 결국은 이미지 및 컬러바에 반영될 컬러테이블은 온전한 상태로 두면서도 컬러바의 선 및 문자들에 대한 색상을 별도로 적용하는 것이 COLORBAR_COYOTE 명령을 사용할 경우에는 여의치않다는 것이 문제입니다. 물론 원래는 COLORBAR_COYOTE 명령에 이러한 기능이 포함되어 있기는 합니다. 이 명령의 소스코드에 수록된 주석문을 보면 ANNOTATECOLOR라는 키워드가 지원되는데 이 키워드가 바로 그러한 역할을 합니다. 다만 이 기능을 온전하게 사용하기 위해서는 COYOTE 라이브러리의 FSC_COLOR 함수 및 관련 루틴들이 추가적으로 필요한데, 이를 위해서는 COYOTE 라이브러리 올드 버전(최신 버전 아닙니다)을 설치해야 한다는 전제가 붙습니다. 따라서 혹시라도 COYOTE 라이브러리 올드 버전을 이미 설치하여 사용중인 유저라면 ANNOTATECOLOR 키워드를 바로 사용하면 됩니다. 하지만 그렇지 않은 유저라면 별도의 방법을 사용해야 합니다. 그래서 그 방법을 소개해보고자 합니다.

 

그 방법은 약간 번거롭게 보일 수도 있지만 컬러바 자체를 그냥 뼈대부터 시작하여 직접 제작하는 것입니다. 사실 DG 체계에서 컬러바를 처음부터 직접 만드는 것이 아주 간단한 작업은 아니긴 합니다. 다만 그 번거로움을 조금이나마 줄이기 위하여 예전에 이 블로그에서 관련 게시물을 통하여 소개되었던 TV_OVER 명령을 사용하고자 합니다. TV_OVER의 소스코드 파일은 그 게시물에도 첨부되어 있지만 여기에도 첨부해둡니다.

 

tv_over.pro
0.00MB

 

먼저 커스텀 컬러테이블을 불러오고 이미지를 표출하는 과정은 이전과 동일합니다.

 

ct = COLORTABLE(['orange', 'red', 'dark red'])
TVLCT, ct
TVSCL, data, 0

 

이 상태에서 컬러바를 처음부터 만드는 과정을 다음과 같이 시작합니다.

 

LOADCT, 0
PLOT, [MIN(data), MAX(data)], [0, 1], YTICKFORMAT='(A1)', XTICKS=5, $
  YTICKLEN=1e-6, XTICKLEN=0.2, XMINOR=1, XSTYLE=1, TITLE='data value', $
  POSITION=[0.1, 0.04, 0.9, 0.09], COLOR=0, /NODATA, /NOERASE

 

이것은 컬러바의 프레임을 구성하는 과정인데, 기본적으로는 XY축으로 구성된 플롯의 형태이며 컬러바의 특성에 맞게 세부 속성들을 설정해본 것입니다. 이 때 선 및 라벨 문자들이 모두 검정색으로 표시되도록 하기 위하여 0번 컬러테이블을 불러오고 색상을 0으로 설정한 것에 유의해야 합니다. 일단 여기까지의 과정에 의한 표출 결과는 다음과 같습니다.

 

 

이와 같이 프레임만 존재하고 컬러바 이미지는 아직 반영되지 않은 상태인데요. 여기서 바로 TV_OVER 명령이 투입됩니다. 그 과정은 다음과 같습니다.

 

imc = BINDGEN(256)#REPLICATE(1, 50)
TVLCT, ct
TV_OVER, imc

 

사실 컬러바 자체도 하나의 이미지입니다. 컬러바 이미지에 해당되는 2차원 배열은 가로 방향으로는 0으로 시작하여 255라는 값으로 증가하고 세로 방향으로는 동일한 값을 유지하는 형태입니다. 여기서는 이러한 2차원 배열을 imc라는 이름으로 생성였는데 이 과정에서 BINDGEN 및 REPLICATE 함수를 사용하였습니다. 이 상태에서 커스텀 컬러테이블을 불러온 다음 바로 TV_OVER 명령을 사용하여 imc를 프레임 내에 이미지로 표시하면 됩니다. 여기까지의 과정에 의한 표출 결과는 다음과 같습니다.

 

 

이 모습을 얼핏 보면 다 된 것처럼 보일 수도 있지만, 아직은 끝난 것은 아닙니다. 잘 보면 프레임 위에 이미지를 표시하면서 뒤덮여진 요소들이 있습니다. 즉 X축의 눈금들은 아예 사라졌고 전체 테두리선도 보이지 않습니다. 따라서 프레임 자체를 다시 한번 표시해주는 것이 필요합니다. 이를 위해서는 앞서 이미 사용했던 PLOT 명령의 내용을 거의 그대로 다시 실행하면 됩니다.

 

LOADCT, 0
PLOT, [MIN(data), MAX(data)], [0, 1], YTICKFORMAT='(A1)', XTICKS=5, $
  YTICKLEN=1e-6, XTICKLEN=0.2, XMINOR=1, XSTYLE=1, $
  POSITION=[0.1, 0.04, 0.9, 0.09], COLOR=0, /NODATA, /NOERASE

 

이와 같은 과정까지 반영된 최종 표출 결과는 다음과 같습니다.

 

 

이 그림을 보면 컬러바의 프레임 및 안쪽 눈금들 및 테두리선이 제대로 표시된 것을 볼 수 있습니다. 어쨌든 이러한 방식으로 처리하면 DG 체계에서 컬러바를 구현하는데 있어서 좀 더 유연한 대처가 가능합니다. 물론 코딩을 좀 더 해줘야겠지만, 그나마 TV_OVER 명령을 추가로 사용함으로써 그 과정을 조금이나마 간소화했다고 보시면 됩니다. 그리고 컬러바의 프레임을 PLOT 명령을 사용하여 만들 때 PLOT 자체의 여러 기능들을 활용하면 유저의 의도에 맞는 커스텀 형태로도 제작이 가능합니다. 예를 들면 약간의 추가적인 손질을 거쳐서 다음과 같은 모습들의 컬러바를 구현하는 것도 얼마든지 가능합니다.

 

 

지금까지 DG 체계에서 컬러바를 직접 제작하는 방법을 살펴보았습니다. 참고로 NG 체계의 경우는 컬러바를 표시하는데 있어서 이렇게 복잡한 고민을 할 필요는 없습니다. NG 체계의 COLORBAR 함수가 이러한 자잘한 기능들을 전부 지원하기 때문입니다. 하지만 DG 체계의 경우는 사정이 또 다르기 때문에 오늘 소개된 내용과 같은 작업이 필요할 수도 있다는 것을 염두에 두시면 좋을 것 같습니다.

반응형