IDL/New Graphics

NG 체계에서 서피스(Surface)와 타 그래픽 요소의 중첩 표출 [1]

이상우_idl 2018. 12. 10. 20:59
728x90
반응형

오늘은 NG 체계에서 서피스(Surface) 형태의 그래픽을 표출한 상태에서 다른 그래픽 요소들을 함께 중첩하여 표출하는 방법에 관하여 알아보고자 합니다. 여기서 얘기하는 "다른 그래픽 요소"는 일단 이미지(Image), 등위선(Contour), 지도(Map)입니다. 어차피 Image, Contour, Surface는 2차원 데이터를 표출하는 대표적인 세가지 방식들이기 때문에 중첩 표출의 필요성과 의미는 충분합니다. 그리고 지도의 경우는 2차원 데이터가 존재하는 지리적 범위를 나타내는 것이기 때문에 그 나름의 의미가 충분히 있습니다. 그래서 Image & Contour, Image & Map, Contour & Map 등의 중첩 표출에 관해서는 제가 이 블로그에서 종종 소개한 바 있습니다. 다만 서피스(Surface)와 타 그래픽 요소와의 중첩 표출에 관해서는 다룬 적이 별로 없었기 때문에 이번에 모아서 소개해보고자 합니다. 그러면 먼저 Surface & Image 표출 방식에 관하여 보기로 하겠습니다. 먼저 예제로 사용할 2차원 데이터를 다음과 같이 배열로 정의합니다.


data = HANNING(400, 400)*100

add = FLTARR(400, 400)

add[240, 40] = HANNING(150, 150)*50

data = data + add

HELP, data

PRINT, MIN(data), MAX(data)


여기서는 HANNING 함수를 이용하여 400x400의 구조를 갖도록 하되, 내부적으로 두개의 피크(Peak)가 존재하도록 하였습니다. 데이터 자체는 0~100의 범위를 갖는데, 두 피크의 극대값은 100과 50이 되도록 하였습니다. 그리고 X축 및 Y축 방향의 격자값들로 구성된 배열들도 다음과 같이 만듭니다.


xx = FINDGEN(400)/40+122

yy = FINDGEN(400)/40+33


이렇게 하면 xx는 122~132의 범위를 갖고 yy는 33~43의 범위를 갖게 됩니다. 이렇게 한 이유는 나중에 할 지도 표출 작업까지도 고려하여 데이터가 존재하는 경도 및 위도 범위의 역할도 하도록 염두에 둔 것입니다. 이제 이 데이터를 서피스의 형태로 표출해 봅시다. 그 과정은 다음과 같이 그래픽 창을 먼저 띄우고 SURFACE 함수를 사용하는 방식입니다.


win1 = WINDOW(DIMENSIONS=[600, 600], /NO_TOOLBAR)

sf1 = SURFACE(data, xx, yy, XRANGE=[122, 132], YRANGE=[33, 43], $

  ZRANGE=[0, 100], /CURRENT)


이 상태에서 이미지를 중첩할텐데, 서피스의 윗부분에 XY 평면의 형태로 중첩되도록 하고자 합니다. 이를 위해서는 다음과 같이 IMAGE 함수를 추가적으로 사용하면 됩니다.


im = IMAGE(data, xx, yy, RGB_TABLE=73, ZVALUE=110, /OVERPLOT)


여기서는 ZVALUE라는 속성에 주목해야 하는데, 이미지 평면이 Z축상에서 어느 위치에 있어야 하는가를 설정하는 역할을 합니다. 이렇게 하면 대략 다음과 같은 그림을 얻게 됩니다.



그런데 표출된 그림을 보면 개선의 필요성이 여기저기서 눈에 띕니다. 일단 이미지 평면에 가려서 서피스의 모습이 일부 가려져서 보이는 문제가 있고, Z축의 스케일이 좀 커서 이미지 평면도 일부가 화면에서 벗어난 모습도 보입니다. 그래서 이러한 단점들을 보완하기 위하여 위의 IMAGE 함수가 사용된 내용을 다음과 같이 수정해 봅시다.


im = IMAGE(data, xx, yy, RGB_TABLE=73, ZVALUE=110, $

  TRANSPARENCY=30, ASPECT_Z=0.07, /OVERPLOT)


여기서는 TRANSPARENCY 속성을 이용하여 이미지 평면을 약간 투명하게 처리하였습니다. 그리고 ASPECT_Z 속성은 XY 스케일과 Z 스케일 사이의 비율을 직접 설정하고자 사용하였습니다. 그림을 보면 X축의 범위가 10이고 Z축의 범위가 100인데, 만약 ASPECT_Z의 값을 0.1로 설정하면 X축의 길이와 Z축의 길이는 같아집니다. 같은 원리로 생각하면 0.1보다 작으면 Z축이 더 짧아지고 0.1보다 크면 Z축이 좀 더 길어지게 됩니다. 그래서 서피스 그림을 그릴 때 XY축에 비하여 Z축의 길이가 어느 정도면 적절할 것인지를 설정할 때 이 속성을 사용하면 됩니다. 이렇게 하여 얻어진 그림은 다음과 같습니다.



이렇게 하니까 먼저 그림에 비해서는 좀 더 나아진 것 같습니다. 그 외에도 서피스와 이미지에 대한 다양한 세부 설정들을 추가하면 여러가지 형태의 표출도 가능하겠지만, 여기서는 이 정도로만 소개해 두겠습니다. 이제 Surface & Contour 표출 방식으로 넘어갑니다. 데이터는 앞서 사용했던 것을 그대로 사용하고, 그림만 따로 그리기 위하여 다음과 같이 또 다른 그래픽 창에 서피스 그림부터 먼저 표출합니다.


win2 = WINDOW(DIMENSIONS=[600, 600], /NO_TOOLBAR)

sf2 = SURFACE(data, xx, yy, XRANGE=[122, 132], YRANGE=[33, 43], $

  ZRANGE=[0, 100], /CURRENT)


이제 앞서 이미지 중첩의 경우와 유사한 방식으로 등위선(Contour) 그림을 XY 평면의 형태로 추가해넣고자 합니다. 이를 위하여 다음과 같이 CONTOUR 함수를 사용하는 내용을 추가합니다.


con = CONTOUR(data, xx, yy, COLOR='black', C_LABEL_SHOW=1, $

  C_VALUE=[0, 10, 30, 50, 70, 90], C_THICK=2, $

  ZVALUE=110, ASPECT_Z=0.07, /OVERPLOT)


여기서는 데이터 값의 범위가 0~100임을 고려하여 등위선이 그려지는 값들을 적절하게 정의하여 C_VALUE 속성에 설정하였습니다. 그리고 각 등위선마다 값이 표시되도록 하기 위하여 C_LABEL_SHOW 속성도 사용하였습니다. 그 외에는 앞서 IMAGE 함수를 사용할 때와 거의비슷합니다. 이렇게 하여 얻은 그림은 다음과 같습니다.



이번에는 색상이 채워진 등위선 그림으로 대체해봅시다. 그러기 위해서는 위의 CONTOUR 함수가 사용된 내용을 다음과 같은 내용으로 대체해야 합니다.


con = CONTOUR(data, xx, yy, C_LABEL_SHOW=1, $

  C_VALUE=[0, 10, 30, 50, 70, 90], C_THICK=2, $

  /FILL, RGB_TABLE=73, TRANSPARENCY=30, $

  ZVALUE=110, ASPECT_Z=0.07, /OVERPLOT)


여기서는 기존의 COLOR 속성을 제거하는 대신 FILL, RGB_TABLE 등의 속성들을 도입하여 색상이 채워진 형태로 등위선이 표출되도록 하였습니다. 그리고 TRANSPARENCY 속성을 이용하여 투명 처리를 하였습니다. 색상이 채워진 등위선 그림은 앞서 이미지의 경우처럼 불투명 상태에서는 배경을 가리기 때문입니다. 이렇게 하면 다음과 같은 그림을 얻게 됩니다.



그런데 이와 같이 색상이 채워진 형태로 그릴 경우에는 선과 라벨문자들이 제대로 보이지 않게 됩니다. 그래서 이런 문제를 극복하려면 처음에 그렸던 것과 같은 등위선 그림을 하나 더 덧그리는 방법을 사용하는 것이 좋습니다. 따라서 다음과 같은 내용을 추가합시다.


con_over = CONTOUR(data, xx, yy, COLOR='black', C_LABEL_SHOW=1, $

  C_VALUE=[0, 10, 30, 50, 70, 90], C_THICK=2, $

  ZVALUE=111, /OVERPLOT)


이렇게 하면 색상이 채워진 등위선 그림은 그대로 둔 상태에서 선과 라벨문자들이 온전한 등위선 그림이 중첩됩니다. 그래서 다음과 같은 그림을 얻을 수 있습니다.



한가지 주목할 점은 Z_VALUE의 값을 110 대신 111로 설정한 것입니다. 이렇게 한 이유는 110으로 그대로 둘 경우에는 추가될 등위선 그림이 색상으로 채워진 등위선 그림에 묻혀서 선과 문자들이 제대로 보이지 않는 문제가 있기 때문입니다. 그래서 약간만 높은 Z좌표에 그려지게 함으로써 이러한 묻힘 효과를 방지하기 위해서 이렇게 해보았습니다. 실제로 Z_VALUE의 값을 110으로 할 경우에는 다음과 같은 그림이 얻어집니다. 111일 경우에 비하면 문자 가독성이 약간 떨어지는 것을 볼 수 있습니다.



마지막으로 이번에는 서피스 자체에 이미지를 덧씌워주는 Texture Mapping 기법을 적용하고 등위선의 값들도 0, 5, 10, ...., 95, 100으로 훨씬 더 늘려서 그림을 표출해 봅시다. 앞서 소개했던 내용과 비교하면 SURFACE 함수에서 TEXTURE_IMAGE 및 RGB_TABLE 속성을 추가로 사용하고 기타 몇가지 속성들을 약간 변형시킨 것입니다. 이 작업을 위한 코드는 다음과 같습니다. 이번에는 컬러 테이블을 다른 것을 사용해 보았습니다.


win3 = WINDOW(DIMENSIONS=[600, 600], /NO_TOOLBAR)

sf3 = SURFACE(data, xx, yy, XRANGE=[122, 132], YRANGE=[33, 43], $

  ZRANGE=[0, 100], TEXTURE_IMAGE=data, RGB_TABLE=34, /CURRENT)

con = CONTOUR(data, xx, yy, C_LABEL_SHOW=0, C_VALUE=[0:100:5], $

  /FILL, RGB_TABLE=34, TRANSPARENCY=30, $

  ZVALUE=110, ASPECT_Z=0.07, /OVERPLOT)

con_over = CONTOUR(data, xx, yy, COLOR='black', C_LABEL_SHOW=0, $

  C_VALUE=[0:100:5], C_THICK=1, ZVALUE=111, /OVERPLOT)


그리고 이렇게 하여 표출된 그림은 다음과 같습니다.



앞서 Surface & Image의 경우와 마찬가지로 Surface & Contour의 경우에도 다양한 세부 설정들을 추가하면 여러가지 형태의 표출이 가능하겠지만, 여기서는 이 정도까지만 소개해 두겠습니다. 그러면 오늘은 여기까지 하고 다음 회차에서는 서피스와 지도 그림을 함께 표출하는 Surface & Map 방식에 관하여 알아보겠습니다.

반응형