오늘은 NG 체계에서 등위선(Contour)을 표출하는데 있어서 컬러바(Colorbar)를 함께 표출하는 방법에 촛점을 맞춰서 소개해보고자 합니다. 또한 그러한 작업에 있어서 유의해야할 이슈들에 대해서도 함께 알아보고자 합니다. 그러면 바로 예제 데이터 생성 및 표출 과정을 봅시다. 그 과정은 다음과 같습니다.
data = HANNING(300, 300)*10
values = [2, 4, 6, 8]
colors = ['blue', 'cyan', 'orange', 'red']
win = WINDOW(DIMENSIONS=[650, 600], /NO_TOOLBAR)
cn = CONTOUR(data, ASPECT_RATIO=1, $
C_VALUE=values, C_COLOR=colors, $
C_LABEL_SHOW=1, $
MARGIN=[0.1, 0.1, 0.2, 0.1], FONT_SIZE=11, /CURRENT)
cb = COLORBAR(TARGET=cn, /BORDER, TITLE='Value', $
ORIENTATION=1, TEXTPOS=1, TICKLEN=0, TAPER=0, $
POSITION=[0.90, 0.15, 0.92, 0.9], FONT_SIZE=10)
여기서는 먼저 300x300의 구조를 갖는 2차원 배열을 생성했는데 값 범위는 0~10입니다. 그래서 등위선을 표출하는데 있어서 2, 4, 6, 8이라는 4개의 값들에 대한 선만 표출되도록 하면서 4개의 색상도 함께 정의하여 각 값에 대하여 색상이 대응되도록 하였습니다. 이렇게 값과 색상을 설정하는데 있어서는 CONTOUR 함수의 C_VALUE 및 C_COLOR 속성을 사용하였습니다. 그리고 바로 이어서 COLORBAR 함수를 사용하여 컬러바를 표출하였는데, 일단 ORIENTATION 속성을 1로 설정하여 세로 방향의 컬러바가 되도록 하였습니다. 또한 NG 체계의 등위선 그래픽에 대한 컬러바가 표출될 때 디폴트로 두면 끝부분이 뾰족해지는 형태가 되는데, 여기서는 TAPER 속성을 0으로 설정함으로써 그냥 사각형이 되도록 처리하였습니다. 이 과정을 실행하면 그 모습은 다음과 같습니다.
일단 여기서 컬러바를 주목해서 보면, 당연히 4개의 색상들로 구성되어 있고 각 색상이 어떤 값에 해당되는지에 대하여 명확하게 표시가 되어있습니다. 그러면 이번에는 등위선을 표출하는데 있어서 선 사이의 빈 공간이 색상으로 채워지도록 해봅시다. 이를 위해서는 CONTOUR 함수가 사용된 부분에서 다음과 같이 FILL 속성을 추가적으로 사용하면 됩니다. 그리고 색상을 채울 경우에는 선과 문자가 덮어지기 때문에 별도의 등위선을 중첩 표출하는 과정도 추가하는 것이 좋습니다. 그래서 등위선 표출에 해당되는 부분에 대하여 이러한 수정사항을 반영한 과정을 보면 다음과 같습니다.
cn = CONTOUR(data, ASPECT_RATIO=1, $
C_VALUE=values, C_COLOR=colors, $
C_LABEL_SHOW=1, /FILL, $
MARGIN=[0.1, 0.1, 0.2, 0.1], FONT_SIZE=11, /CURRENT)
cno = CONTOUR(data, COLOR='black', C_VALUE=values, $
C_LABEL_SHOW=1, C_THICK=2, /OVERPLOT)
여기서는 새로 추가된 부분을 진하게 표시하였습니다. 그리고 뒤에 이어지는 COLORBAR 함수가 사용된 부분은 그대로입니다. 이러한 변경 사항이 반영되어 표출된 모습은 다음과 같습니다.
그런데 이 그림의 경우 그냥 얼핏 보면 별다른 문제가 없어보일 수도 있지만, 엄밀히 따지면 조금 애매한 부분이 있습니다. 바로 색상과 값의 대응 방식에 관한 문제인데요. 왼쪽의 등위선 그림을 먼저 보면 각 색상이 마치 특정한 값 자체가 아닌 값 범위에 대응되는 것처럼 보입니다. 예를 들면 2~4범위에 해당되는 부분의 색상은 blue이고 4~6 범위에 해당되는 부분의 색상은 cyan입니다. 그런데 오른쪽의 컬러바를 보면 마치 blue 색상은 2라는 값 자체에만 대응되고 cyan 색상은 4라는 값에만 대응되는 것으로 보입니다. 그럴 수 밖에 없는 것이, 처음에 표출했던 그림의 등위선에서는 각 색상이 어떤 범위가 아닌 특정한 값(2 또는 4)에 대응되도록 했고 컬러바에서도 그렇게 표시를 했었기 때문입니다. 결국 두번째 그림을 표출할 때 CONTOUR 함수에서 FILL 속성을 사용하여 값과 값 사이를 색상으로 채웠지만, 컬러바의 표출 방식은 그대로 뒀기 때문에 이러한 혼란이 발생한 것입니다.
그래서 만약 등위선의 표출에 있어서 값과 값 사이를 색상으로 채우면서도 컬러바 역시 값 범위 기반으로 표시되게 하려면 사실은 약간의 요령이 필요합니다. 다행히 그리 복잡하지는 않습니다. 그 방법은 다음과 같이 일종의 들러리(?) 값 및 색상을 추가하는 것입니다. 즉 다음과 같습니다.
data = HANNING(300, 300)*10
values = [2, 4, 6, 8, MAX(data)]
colors = ['blue', 'cyan', 'orange', 'red', 'black']
win = WINDOW(DIMENSIONS=[650, 600], /NO_TOOLBAR)
cn = CONTOUR(data, ASPECT_RATIO=1, $
C_VALUE=values, C_COLOR=colors, $
C_LABEL_SHOW=1, /FILL, $
MARGIN=[0.1, 0.1, 0.2, 0.1], FONT_SIZE=11, /CURRENT)
cno = CONTOUR(data, COLOR='black', C_VALUE=values, C_LABEL_SHOW=1, $
C_THICK=2, /OVERPLOT)
cb = COLORBAR(TARGET=cn, /BORDER, TITLE='Value', $
ORIENTATION=1, TEXTPOS=1, TICKLEN=0, TAPER=0, $
POSITION=[0.90, 0.15, 0.92, 0.9], FONT_SIZE=10)
여기서는 수정이 필요한 부분만 진한 색으로 표시하였는데, values 및 colors의 값들의 구성이 기존과 달라진 것을 볼 수 있습니다. 즉 최대치에 해당되는 값을 하나 추가하고 여기에 대응되는 black이라는 색상을 추가한 것인데요. 일단 결과 그림부터 볼까요? 그 모습은 다음과 같습니다.
이 그림에서는 특히 오른쪽의 컬러바를 주목해야 합니다. 이제는 컬러바에서도 각 색상이 값 자체가 아닌 값 범위에 대응되는 형태로 표출된 것을 확인할 수 있습니다. 즉 눈금값이 컬러 마디의 중심이 아닌 각 마디에 표시된 것입니다. 그리고 컬러바의 마디에 해당되는 값들은 이제 2, 4, 6, 8 뿐 아니라 최대치인 10까지도 표시되었지만, 추가된 색상인 black은 실제로는 표시되지 않습니다. 어차피 최대치를 넘는 값은 존재하지 않기 때문에 실제로는 사용되지 못한 셈입니다. 어쨌든 이러한 요령을 사용하면 우리가 의도했던 결과를 얻을 수 있음을 확인할 수 있습니다.
그리고 이와 유사한 요령을 최소치에 대해서도 적용해볼 수도 있습니다. 즉 다음과 같이 values 및 colors만 변경하는 것입니다.
values = [MIN(data), 2, 4, 6, 8, MAX(data)]
colors = ['light gray', 'blue', 'cyan', 'orange', 'red', 'black']
이러한 변화만 적용하여 다시 실행해보면 그 결과는 다음 그림과 같습니다.
그러면 이와 같이 최소치부터 2까지의 범위는 옅은 회색으로 처리가 됩니다. 물론 컬러바 역시 각 색상에 대응되는 구간을 잘 표시해주는 것도 확인할 수 있습니다.
정리를 해본다면, 등위선의 표출에 있어서 특히 값 사이사이를 색상으로 채우는 경우에는 대응되는 컬러바 역시 그 특성에 맞게 표시되도록 하기 위한 별도의 처리를 할 필요가 있다는 것입니다. 그리고 등위선 표출과 연동되는 컬러바의 표출 방식은 기본 설정상으로는 값 범위가 아닌 값 자체에 대응되는 방식을 따릅니다. 따라서 값 자체 또는 값 범위 중 어느 쪽에 촛점을 맞출 것인가를 확실히 결정할 필요가 있고, 만약 값 범위에 촛점을 맞추는 방식의 표출이 되도록 해야 할 경우에는 위와 같은 요령을 사용하는 것이 필요할 수 있다는 것을 염두에 두시면 좋을 것 같습니다.
'IDL > New Graphics' 카테고리의 다른 글
그래픽 좌표 체계(Data, Device, Normal)의 이해 (0) | 2022.01.11 |
---|---|
NG 체계의 그래픽 개체의 특성 및 활용 (0) | 2021.10.07 |
BOXPLOT 함수 소개 (0) | 2021.09.07 |
3차원 큐브 데이터의 등위면(Isosurface) 산출 및 표출 (0) | 2021.08.19 |
NG 체계 플롯에서 타이틀 문자의 세부 설정 (0) | 2021.08.09 |