오늘은 NG 체계에서 등위선(Contour)의 표출에 있어서 라벨 문자들의 세부 속성을 설정하는 방법에 관하여 다뤄보고자 합니다. 사실 NG 체계의 CONTOUR 함수를 이용하여 등위선을 표출하는 방법 및 관련 예제는 이 블로그에서 제가 심심치않게 소개했던 바 있습니다. 그런데 오늘은 이러한 표출에 있어서 라벨 문자들, 즉 등위선 표출에 있어서 각 선에 해당되는 값이 문자로 표시되는 것들에 대한 세부적인 설정 방법에 관하여 다뤄보고자 하는 것입니다. 먼저 다음과 같이 예제 데이터를 정의하고 이를 기본적인 등위선(Contour)의 형태로 표출해 봅시다. 그 과정은 다음과 같습니다.
data = HANNING(600, 600)*100
HELP, data
PRINT, MIN(data), MAX(data)
win = WINDOW(DIMENSIONS=[600, 600], /NO_TOOLBAR)
cn = CONTOUR(data, RGB_TABLE=34, $
C_THICK=2, FONT_SIZE=12, MARGIN=0.1, /CURRENT)
여기서는 배열 구조가 600x600이고 값 범위는 0~100인 가상의 2차원 데이터를 생성하고, 이 데이터 배열을 CONTOUR 함수에 투입하여 등위선 형태로 표출하였습니다. 특히 값의 고저에 따른 색상 적용을 위하여 34번 컬러테이블을 적용하였습니다. 이대로 실행하면 다음과 같은 그림이 표출될 것입니다.
하지만 이 그림은 CONTOUR 함수로 설정 가능한 다양한 세부 속성들을 건드리지 않은 디폴트 상태로 표출된 상태입니다. 그림을 보면 10부터 90까지 10의 간격으로 등위선들이 형성되었고, 각 등위선의 값에 대응되는 라벨 문자들도 띄엄띄엄 표시된 것을 볼 수 있습니다. 이런 부분들에 대해서는 직접 명시적으로 설정해주는 것이 좋습니다. 먼저 등위선으로 표출될 값들을 C_VALUE 속성을 사용하여 직접 설정하고, 표출된 모든 등위선마다 라벨 문자가 표시되도록 하기 위하여 C_LABEL_SHOW 속성을 사용합니다. 이를 위하여, 위의 내용에서 CONTOUR 함수가 사용된 부분을 다음과 같이 변경해 봅시다.
cn = CONTOUR(data, RGB_TABLE=34, $
C_VALUE=[20, 40, 60, 80], C_LABEL_SHOW=1, $
C_THICK=2, FONT_SIZE=12, MARGIN=0.1, /CURRENT)
여기서는 20, 40, 60, 80의 4개의 값들에 대해서만 등위선이 표시되도록 하고, C_LABEL_SHOW 속성의 값을 1로 설정하여 모든 등위선들에 라벨 문자가 표시되도록 하였습니다. 그 결과는 다음 그림과 같습니다.
이 그림에서는 라벨 문자의 색상이 각 등위선의 색상과 일치하는데, 만약 가독성을 위하여 등위선들의 색상은 그대로 두고 라벨 문자들의 색상만 검정색으로 통일하고 싶다면 LABEL_COLOR라는 속성을 사용하면 됩니다. 그런데 이 속성은 CONTOUR 함수가 사용된 이후에 후속 설정의 방식으로 사용하는 것이 좋습니다. 즉 다음과 같은 방식입니다.
cn = CONTOUR(data, RGB_TABLE=34, $
C_VALUE=[20, 40, 60, 80], C_LABEL_SHOW=1, $
C_THICK=2, FONT_SIZE=12, MARGIN=0.1, /CURRENT)
cn.LABEL_COLOR = 'black'
이 상태로 실행하면 결과는 다음 그림과 같습니다.
이번에는 C_LABEL_INTERVAL이라는 속성을 소개해보고자 합니다. 이 속성에 관해서는 아마 익숙하지 않은 유저들이 많으실 것 같은데요. IDL 도움말의 CONTOUR 함수에 관한 내용에서 이 속성에 관한 설명을 보면 다음과 같이 나와 있습니다.
C_LABEL_INTERVAL
Set this property to a vector of values indicating the distance (relative to the length of each contour path) between labels for each contour level. If the number of contour levels exceeds the number of provided intervals, the values will be repeated cyclically. The default is 0.4.
이 설명을 보면 등위선상에 표시되는 라벨 문자들의 간격이라고 기술되어 있습니다. 그런데 이 값은 상대적인 값입니다. 즉 설명에 의하면 해당 등위선의 길이에 따라 다르다고 합니다. 그 의미를 살펴보기 위하여 다음과 같이 이 속성에 대하여 0.4라는 값을 부여해 봅시다.
cn = CONTOUR(data, RGB_TABLE=34, $
C_VALUE=[20, 40, 60, 80], C_LABEL_SHOW=1, $
C_THICK=2, FONT_SIZE=12, MARGIN=0.1, /CURRENT)
cn.LABEL_COLOR = 'black'
cn.C_LABEL_INTERVAL=0.4
그 결과는 다음 그림과 같습니다.
이 그림을 보면 각 등위선마다 라벨 문자가 두번씩 반복 표시되고 있습니다. 그 이유는 하나의 등위선 상에서 라벨 문자의 표시 간격이 그 등위선 길이의 0.4만큼이 되도록 한 것이기 때문입니다. 등위선의 전체 길이가 1이기 때문에 0.4의 간격이라면 두번 표시가 되는 것입니다. 따라서 이 값을 더 작게 할 경우에는 등위선 상의 라벨 문자들이 더 많아질 것입니다. 만약 0.2로 설정할 경우에는 그 결과는 다음 그림과 같습니다.
이 C_LABEL_INTERVAL 속성에 부여할 수 있는 값의 범위가 명확히 정해져 있는 것은 아니지만, 실질적으로는 0~1의 범위 내에 있는 값이라고 보면 됩니다. 그리고 대략 0~0.5 범위 내에 있을 경우에는 등위선 상에 라벨 문자가 여러번 반복되어 표시되고, 대략 0.5~1의 범위 내에 있을 경우에는 라벨 문자가 한번만 표시됩니다. 만약 0.7로 설정할 경우에는 그 결과는 다음 그림과 같습니다.
결국 등위선 상에서 라벨 문자 간격을 조정함으로써, 등위선 상에서의 라벨 문자의 위치를 조정하는 효과를 얻게 됨을 알 수 있습니다. 그리고 이 속성에 부여되는 값은 위와 같이 단일값도 가능하지만 배열의 형태로도 가능합니다. 배열이 될 경우에는 각 등위선마다 다른 값이 적용되도록 할 수 있습니다. 예를 들어 다음과 같이 해봅시다.
cn.C_LABEL_INTERVAL=[0.6, 0.7, 0.8, 0.9]
그 결과는 다음 그림과 같습니다.
이와 같이 각 등위선별로 차등적으로 적용하는 것도 가능합니다. 사실 등위선 표출에 있어서 라벨 문자가 등위선 상의 어느 위치에 표시되느냐는 그리 중요한 이슈가 아닐 수도 있습니다. 대개의 경우는 그냥 알아서 표시되도록 해도 큰 무리는 없습니다. 하지만 값의 분포가 부드럽지 않아서 각 등위선의 길이가 서로 다른 경우에는 약간 고민이 필요할 수도 있습니다. 예를 들어서 표출의 대상이 되는 2차원 데이터를 다음과 같이 변경해 봅시다.
data = HANNING(600, 600)*100
add = FLTARR(600, 600)
add[360, 60] = HANNING(220, 220)*50
data = data + add
그리고 예제 코드의 그 외 나머지 부분들은 그대로 두고, C_LABEL_INTERVAL 속성의 값만 다음과 같이 0.6으로 통일해 봅시다.
cn.C_LABEL_INTERVAL=0.6
이렇게 변경한 다음 다시 실행해보면 다음과 같은 그림을 얻게 됩니다.
즉 이 경우는 각 등위선의 길이가 서로 차이가 제법 나고 등위선의 형태도 서로 많이 다르기 때문에, C_LABEL_INTERVAL 속성의 값을 일괄 적용하더라도 라벨 문자의 위치가 각 등위선마다 차이가 많이 나는 경우가 됩니다. 물론 이러한 상태로 그림을 표출해도 별로 거슬리지 않다면 그대로 가도 됩니다. 하지만 혹시라도 라벨 문자들의 위치가 이 상태로는 마음에 들지 않는다면, C_LABEL_INTERVAL 속성에 부여되는 값을 배열로 대체하고 배열 내 값들을 직접 세부 조정하는 수 밖에 없습니다. 그리고 마음에 드는 최적의 결과를 얻기 위해서는 여러번의 시행착오가 필요할 수도 있습니다. 제가 나름대로 얻은 최적의 값들의 조합은 다음과 같습니다.
cn.C_LABEL_INTERVAL=[0.65, 0.52, 0.51, 0.6]
이렇게 하면 다음과 같은 그림을 얻게 됩니다.
따라서 표출되는 등위선의 갯수가 많고 형태도 다양한 상태에서, 만약 라벨 문자들의 적정한 위치까지 고민해야 하는 경우에는 이와 같이 다소 귀찮은 튜닝(?)이 필요할 수도 있습니다. 이런 부분까지 IDL이 알아서 다 해준다면 정말 좋겠으나 현실은 그렇지 않네요. 어차피 우리가 그림 표출에 있어서 보기 좋은 결과를 얻기 위해서는 약간의 귀찮음을 감당해야 할 수도 있다는 점을 감안하는 것이 좋습니다.
이번에는 문자들의 폰트 크기의 조절 방법입니다. 라벨 문자의 크기 조정은 다음과 같이 FONT_SIZE 속성을 이용하여 후속 변경으로 처리하는 것이 좋습니다.
cn.FONT_SIZE = 24
이렇게 하면 다음과 같은 그림을 얻게 됩니다.
그리고 X축 및 Y축의 눈금 문자들에 대해서도 개별적인 크기 설정이 가능합니다. 다음과 같이 각 축마다 개별적으로 설정하면 되며, 이를 위하여 XTICKFONT_SIZE 또는 YTICKFONT_SIZE 속성을 이용하면 됩니다.
cn.XTICKFONT_SIZE = 18
cn.YTICKFONT_SIZE = 10
이렇게 하면 라벨 문자, X축 눈금 문자, Y축 눈금 문자들이 서로 다른 크기로 표시되도록 할 수 있습니다. 그 모습은 다음 그림과 같습니다.
그리고 마지막으로 C_LABEL_SHOW 속성에 관하여 첨언한다면, 이 속성에 대해서는 1 또는 0과 같은 단일값 뿐 아니라 1 또는 0의 값들로 구성된 배열을 설정할 수도 있습니다. 앞서 CONTOUR 함수가 사용되었던 부분에서 C_LABEL_SHOW 속성만 다음과 같이 변경해 봅시다.
cn = CONTOUR(data, RGB_TABLE=34, $
C_VALUE=[20, 40, 60, 80], C_LABEL_SHOW=[1, 1, 0, 1], $
C_THICK=2, FONT_SIZE=12, MARGIN=0.1, /CURRENT)
이렇게 하면 4개의 등위선들 중 세번째, 즉 값 60에 대응되는 등위선에 대해서만 라벨 문자가 나타나지 않도록 처리됩니다. 즉 각각의 등위선 별로 개별적인 설정이 가능합니다. 위의 그림을 얻는 과정에서 C_LABEL_SHOW 속성만 이렇게 변경한다면, 다음과 같은 그림을 얻게 됩니다.
그리고 C_LABEL_SHOW 속성의 값을 다음과 같이 단일값 0으로 설정한다면, 모든 등위선들에 대하여 라벨 문자가 전혀 표시되지 않도록 할 수도 있습니다.
cn = CONTOUR(data, RGB_TABLE=34, $
C_VALUE=[20, 40, 60, 80], C_LABEL_SHOW=0, $
C_THICK=2, FONT_SIZE=12, MARGIN=0.1, /CURRENT)
따라서 오늘 소개한 속성들 중에서 특히 C_LABEL_SHOW, C_LABEL_INTERVAL 등의 속성들을 적절히 활용하면 등위선 형태의 가시화에서 특히 라벨 문자들의 표시에 있어서 좀 더 디테일하고 다양한 방식의 세부 설정이 가능하다는 것을 염두에 두시면 좋을 것 같습니다. 오늘 내용은 여기서 마칩니다.
'IDL > New Graphics' 카테고리의 다른 글
색상을 채운 플롯(Filled Plot)의 표출 [2] (0) | 2020.10.07 |
---|---|
에러바(Error Bar)의 표출 [2] (0) | 2020.08.05 |
CLIP 속성의 이해와 응용 [2] (0) | 2020.04.16 |
VOLUME 함수를 이용한 3차원 큐브 데이터의 가시화 [2] (0) | 2020.01.20 |
VOLUME 함수를 이용한 3차원 큐브 데이터의 가시화 [1] (0) | 2020.01.15 |