IDL/New Graphics

IMAGE and CONTOUR in NG [1]

이상우_idl 2017. 4. 7. 10:00
728x90
반응형

얼마전에 NG 체계의 SURFACE 함수에 관하여 2회에 걸쳐 소개해본 바 있습니다. 2차원 데이터를 표출하는 방법으로서 SURFACE 함수를 사용하는 기본적인 방법들을 살펴보는 내용이었는데요. 이번에는 2차원 데이터를 표출하는 또 다른 방법들이라 할 수 있는 IMAGE 및 CONTOUR 함수를 주제로 다뤄보고자 합니다. 사실 NG 체계의 IMAGE, CONTOUR 함수들에 대해서는 제가 이 블로그의 다른 게시물들에서 종종 언급한 바 있습니다. 따라서 제가 이번에 소개할 내용들 중 일부는 과거에 언급되었던 것들과 다소 중복될 가능성도 있습니다. 다만 이번 게시물들에서는 제가 IMAGE와 CONTOUR를 함께 다뤄보면서 기본적이면서도 좀 더 새로운 내용들도 소개될 수 있도록 하겠습니다.


먼저 설명을 위한 가상의 2차원 데이터를 다음과 같은 방식으로 만들어 봅시다. 제가 항상 애용하는 HANNING 함수를 적절하게 활용해 보았습니다. 이 가상의 2차원 데이터는 data라는 이름의 배열로 만들어졌으며, 크기는 400x400이고 값의 범위는 0~100이 되도록 하였습니다.


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)


이제 먼저 IMAGE 함수를 사용하여 가장 기본적인 이미지의 형태로 이 데이터를 표출해 봅시다. 다음과 같이 WINDOW 함수를 사용하여 그래픽 창을 띄운 다음 IMAGE 함수를 이용하면 됩니다.


win = WINDOW(DIMENSIONS=[500, 500], /NO_TOOLBAR)

im = IMAGE(data, RGB_TABLE=73, MARGIN=0.1, /CURRENT)


여기서는 이미지를 표출하는데 있어서 그래픽 창의 상하좌우에 0.1 크기(노멀 좌표계 기준)의 여백을 주었으며 컬러테이블 73번을 사용하였습니다. 표출된 모습은 다음 그림과 같습니다.



위의 내용을 다음과 같이 약간 수정하여, IMAGE 함수에서 AXIS_STYLE 키워드의 값을 2로 설정할 수도 있습니다. 이미지 자체에 X, Y축을 추가적으로 표출하기 위하여 사용하는 방법입니다. 이 경우에는 다음과 같은 그림을 얻게 됩니다.


win = WINDOW(DIMENSIONS=[500, 500], /NO_TOOLBAR)

im = IMAGE(data, RGB_TABLE=73, MARGIN=0.1, AXIS_STYLE=2, /CURRENT)



이와 같이 이미지 자체에 X, Y축을 추가하는 것이 가능합니다. 그리고 이렇게 추가적으로 표출된 X, Y축의 세부적인 특성들을 제어하려면 우리가 PLOT 함수를 사용할 경우와 같은 요령으로 관련 속성들을 추가하면 됩니다. 예를 들어 X, Y축의 메이저 눈금들의 간격을 기존의 100 대신 50으로 바꾸려면 다음과 같이 XTICKINTERVAL, YTICKINTERVAL 속성을 설정하면 됩니다. 그 결과는 다음 그림과 같습니다.


im.XTICKINTERVAL = 50

im.YTICKINTERVAL = 50



이번에는 그래픽 창 안에서 이미지의 위치를 조금 위쪽으로 옮겨 보겠습니다. 왜냐하면 이미지 바로 하단에 컬러바를 삽입하기 위해서입니다. 이를 위하여 다음과 같이 POSITION 속성을 사용합니다. 이 속성에는 4개의 값들로 구성된 배열이 주어져야 합니다. 이 값들은 이미지가 점유하는 사각형 공간의 좌측하단 꼭지점의 좌표(X1, Y1) 그리고 우측상단 꼭지점의 좌표(X2, Y2) 값들에 해당되며, 노멀 좌표계를 기준으로 합니다.


im.POSITION = [0.1, 0.17, 0.9, 0.97]


이렇게 이미지의 위치를 변경하여 컬러바가 삽입될 자리를 확보한 후 다음과 같이 COLORBAR 함수를 사용하여 컬러바를 하단에 표출하면 됩니다.


cb = COLORBAR(TARGET=im, TITLE='Value', FONT_SIZE=10, TAPER=0, $

  POSITION=[0.2, 0.08, 0.8, 0.11])


이 때 COLORBAR 함수에서도 POSITION이란 속성이 사용된 것을 볼 수 있는데, 여기 부여되는 값들의 개념은 위에서 설명했던 것과 같습니다. 수평 방향의 컬러테이블을 하단에 배치하기 위하여 이와 같이 POSITION 속성을 사용하였습니다. 그리고 COLORBAR 함수에서 중요한 또 하나의 속성은 TARGET입니다. 앞서 IMAGE 함수로 구현된 결과물, 즉 IMAGE 함수가 사용된 명령에서 좌변에 있는 변수(여기서는 im)를 TARGET 속성에 부여해야 한다는 점이 중요합니다. 이와 같은 방식으로 컬러바를 하단에 추가 삽입한 모습은 다음 그림과같습니다.



이번에는 이미지 위에 등위선(Contour)을 중첩해 봅시다. 이를 위해서는 기본적으로 CONTOUR 함수를 사용하되 /OVERPLOT 키워드를 함께 사용해야 합니다. 그래야 IMAGE 함수로 표출된 이미지 위에 등위선이 추가적으로 중첩 표출되는 효과를 얻을 수 있습니다. 이를 위하여 다음과 같은 내용을 추가해 봅시다.


conv = [20, 30, 50, 60, 80]

cn = CONTOUR(data, C_VALUE=conv, COLOR='black', C_THICK=2, $

  C_LABEL_SHOW=1, /OVERPLOT)


여기서는 CONTOUR 함수를 사용하면서 몇가지 추가적인 속성들을 설정하였습니다. 사실 CONTOUR 함수를 사용하는 방법에 관하여 제대로 얘기하려면 너무 방대하기도 하고, 이 블로그의 다른 게시물들에서도 그 사용법 및 예제들이 자주 언급된 바 있습니다. 따라서 핵심적인 부분만 요약해서 언급하기로 합니다. CONTOUR 함수를 사용하여 등위선을 표출하는데 있어서 가장 중요한 것은 어떤 값에 해당되는 선들을 표시할 것인가를 결정하는 일입니다. 현재 사용중인 예제 데이터에서는 값의 범위가 0~100인데, 이 중 어떤 값들에 대한등위선을 표시할 것인가를 결정하여 이 값들을 하나의 배열로 만들어두면 좋습니다. 위에 나오는 conv라는 것이 그러한 예인데, 내용 그대로 5개의 값들(20, 30, 50, 60, 80)에 대하여 선을 그리기 위하여 CONTOUR 함수의 C_VALUE 속성에 이 conv를 부여하였습니다. 그리고 이 5개의 값들에 해당되는 등위선마다 그 값을 라벨문자로 모두 표시하기 위하여 C_LABEL_SHOW 속성에 1이란 값을 부여하였다는 점 정도까지만 일단 염두에 두면 됩니다. 이와 같은 방식으로 등위선을 중첩 표출하면 그 결과는 다음 그림과 같습니다.



이와 같이 2차원 데이터를 표출하는데 있어서 IMAGE와 CONTOUR를 모두 사용하여 중첩 표출하는 것이 필요할 경우가 꽤 있습니다. 그리고 조금만 더 응용을 해보면 SURFACE 함수까지 함께 사용하여 좀 더 입체적인 표출도 가능합니다. 이 블로그에서 얼마전에 제가 올렸던 SURFACE 함수에 관한 게시물 하단부의 내용을 참조하여, 이번 표출 작업에 응용해 봅시다. 아예 별도의 그래픽 창을 띄워서 표출되도록 다음과 같은 내용을 추가하면 됩니다.


win_sf = WINDOW(DIMENSIONS=[600, 600])

sf = SURFACE(data, TEXTURE_IMAGE=data, RGB_TABLE=73, /CURRENT)

cn_sf1 = CONTOUR(data+1, C_VALUE=conv, COLOR='black', C_THICK=2, $

  C_LABEL_SHOW=1, ZVALUE=130, ZRANGE=[0, 100], /OVERPLOT)

cb_sf = COLORBAR(TARGET=sf, TITLE='Value', FONT_SIZE=9, TAPER=0, $

  POSITION=[0.2, 0.05, 0.8, 0.08])


여기서는 별도의 그래픽 창을 띄운 후, data를 SURFACE 함수를 사용하여 표출하였습니다. 이 때 서피스의 표면이 이미지의 컬러와 동일하게 보이도록 하기 위하여 TEXTURE_IMAGE 속성을 사용하여 텍스쳐 맵핑을 적용한 것입니다. 그리고 이어서 CONTOUR 함수를 사용하여 등위선을 서피스의 윗 부분에 중첩 표출하였습니다. 즉 서피스의 Z축상으로 약간 위쪽에 등위선 평면이 위치하도록 한 것입니다. 이를 위하여 CONTOUR 함수 내에서 ZVALUE 속성이 중요한 역할을 하였습니다. 그 다음에 COLORBAR 함수를 사용하여 컬러바를 하단에 삽입하였습니다. 이 결과는 다음 그림과 같습니다.



그리고 여기서 CONTOUR 함수를 한번 더 사용하여 서피스 표면상에 등위선이 그려지도록 하는 것도 가능합니다. 이를 위하여 다음과 같은 내용을 추가하여 실행해 봅시다.


cn_sf2 = CONTOUR(data+1, C_VALUE=conv, COLOR='black', C_THICK=2, $

  C_LABEL_SHOW=0, PLANAR=0, ZRANGE=[0, 100], /OVERPLOT)


그러면 다음 그림과 같이 마치 서피스 표면위에 선을 덧그린 것과 같은 효과를 얻을 수 있습니다.



여기서는 PLANAR 속성의 값을 0으로 설정한 것이 가장 핵심인데요. 이 속성은 등위선을 그리는데 있어서 2차원 평면상에 나타낼 것인가 아니면 등위선 값들을 Z축에 대응시켜 입체적으로 나타낼 것인가를 결정합니다. 사실 등위선(Contour) 그림이라고 하면 당연히 2차원 평면상의 모습으로 생각하게 되지만, NG 체계의 CONTOUR 함수는 이와 같은 3차원적인 느낌의 표출도 가능하다는 점 참조해두시면 좋을 것 같습니다.


그러면 다음 회차 게시물에서 좀 더 내용을 이어나가기로 하고 오늘은 이 정도로 마무리하겠습니다.

반응형