IDL/New Graphics

Polar Grid Image(?)를 그려봅시다

이상우_IDL 2015. 5. 29. 15:34
728x90

최근에 어떤 IDL 유저께서 IDL/ENVI 질문 게시판에 올린 질문이 하나 있었는데요. 그 내용은 아래 링크의 웹페이지에 있는 두번째 그림과 같은 것을 IDL에서도 그릴수 있는가에 대한 질문이었습니다.


링크 누르기


그림을 보면 마치 거미줄과 비슷합니다. 세부 내용을 보면 (r, theta)로 된 극좌표 기반의 격자 자료가 있을 경우, 격자값들을 셀과 같은 형태로 표출하는 경우입니다. 다만 XY좌표가 아닌  극좌표 기반의 자료이기 때문에 그 표출 역시 방사상으로 분포하는 셀들의 형태가 되어야 한다는 차이가 있습니다. 사실 이와 같은 그림을 그릴 수 있도록 준비된 전용 그래픽 루틴은 IDL에 아직은 없습니다(제가 알기로는). 그렇다고 방법이 없는 것은 아닙니다. 다만 IDL에 존재하는 기존의 기능들을 활용하여 만들어야 하겠지요. 이러한 그림을 구현하는 방법은 DG, NG 모두에서 가능하겠지만, 저는 NG에서 한번 구현을 해보고자 한번 시도를 해보았습니다.


일단 예제로 사용할 극좌표 기반의 격자 자료를 아래와 같이 준비해보았습니다. 반경인 R은 1이며 중심인 0으로부터 1까지 0.2 간격으로 총 5개의 격자점들이 존재합니다. 그리고 방위각은 0~360까지 30도의 간격으로 총 12개의 격자점들이 존재합니다. 즉 (r, theta) 기준으로 5X12의 격자구조를 갖는 경우이며, 각 셀마다의 실제 데이터값들로 이루어진 5X12의 구조를 갖는 2차원 배열이 존재한다고 합시다. 이를 위한 가상의 예제 자료를 그냥 랜덤값 생성 함수까지 사용하여 다음과 같은 방식으로 만들어 보았습니다.


nr = 5

r = (FINDGEN(nr)+1)/nr

nth = 12

theta = FINDGEN(nth)*360./nth

z = FIX(RANDOMN(seed, nr, nth)*40+140)


여기서 격자 자료인 z의 데이터값은 대략 0~260 정도의 범위를 갖도록 하였습니다. 이 값이 바로 컬러값으로 대응될 수 있도록 하기 위해서입니다. 물론 실제 데이터값이 이러한 범위와 다르다면, 컬러값으로 가능한 0~255와 대응되도록 약간의 스케일 조정은 필요합니다. 어쨌든 이와 같이 가상으로 생성한격자 자료를 갖고 표출을 해보려고 하는데요. 이러한 표출 작업을 수행하도록 제가 그냥 하나의 루틴으로 만들어 보았습니다. 이 루틴의 이름은 PLOT_POLAR_GRID_NG입니다. 위와 같은 형태의 데이터를 인자로 받아서 그림을 그리는 기능을 수행합니다. 따라서 다음과 같이 NG 기반의 그래픽창을 하나 띄우고 바로 이 루틴을 사용해보았습니다.


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

PLOT_POLAR_GRID_NG, r, theta, z, RGB_TABLE=67, MARGIN=0.1, THICK=2, /CURRENT, PLOT=pl


여기서 처음 세 인자는 r, theta, z의 순서로 넣으면 됩니다. 그리고 몇몇 키워드들이 사용 가능하도록 준비되어 있는데요. 대략 다음과 같습니다.


CURRENT : 그림을 이미 준비된 그래픽창에 그릴 경우 CURRENT=1 또는 /CURRENT와 같이 사용

THICK : 그려질 셀들의 윤곽선의 두께 (디폴트는 1)

RGB_TABLE : 격자별 색상을 표출할 컬러테이블 번호

PLOT : 이 키워드에 지정된 변수를 통하여, 표출된 PLOT 개체의 인스턴스를 돌려받음


리고 이 PLOT_POLAR_GRID_NG에서는 기존의 PLOT 함수에서 지원되는 다른 키워드들도 모두 사용 가능합니다. 이 루틴을 사용하여 그림을 그린 결과는 다음과 같습니다.



제법 그럴 듯하게 그려진 것 같습니다. 다만 아쉬운 부분이 좀 있는데 바로 처리속도입니다. 그림 표출을 완료하는데 있어서 시간이 좀 걸립니다. 제 컴퓨터의 경우 이러한 그림을 다 그리는데 약 3~4초 정도가 걸렸습니다. 사실 셀들의 갯수가 더 늘어나면 소요시간도 그에 비례하여 증가합니다. 만약 다음과 같이 r, theta 방향의 격자 크기를 두 배로 늘려서 10X24의 데이터로 그려보는 경우 다음 그림과 같이 셀들이 더 많아진 그림을 얻을 수 있지만 그에 따라 소요시간도 훨씬 더 늘어납니다.


nr = 10

r = (FINDGEN(nr)+1)/nr

nth = 24

theta = FINDGEN(nth)*360./nth

z = FIX(RANDOMN(seed, nr, nth)*40+140)

win = WINDOW(DIMENSIONS=[600600])

PLOT_POLAR_GRID_NG, r, theta, z, RGB_TABLE=67, MARGIN=0.1, THICK=2, /CURRENT, PLOT=pl


제 컴퓨터에서는 이 그림을 얻는데 약 24초 정도가 걸렸습니다. 물론 WINDOW의 Refresh 속성을 일시적으로 끈다든지 아니면 컴퓨터 사양이 더 좋다든지 할 경우 약간 줄일 수 있는 여지는 있겠지만 눈에 띌 정도의 시간 단축이 나타날 것인지는 미지수입니다. 아쉽지만 이것은 어쩔 수 없는 부분입니다. IDL의 NG 체계에서 폴리곤이 구현되는 속도 자체가 아직까지는 아주 빠른 편은 아니기 때문입니다. 따라서 단발성으로 이러한 그림을 얻어야 하는 경우라면야 그냥 감수할 수도 있겠지만, 만약 이러한 그림을 많은 갯수를 얻어야 할 경우에는 소요시간이란 부분이 분명 문제가 될 여지도 있을겁니다.


물론 오늘 제시했던 방법보다 좀 더 빠른 방법이 있을지도 모르겠으나 구체적으로 어떤 방식이 되어야 할지는 아직은 모르겠습니다. 혹시나 더 괜찮은 방법이 발견된다면 여기에 다시 포스팅을 해보겠습니다. 그래도 궁극적으로는 지난번에 올렸던 Pie Chart의 경우도 그렇고 결국은 IDL 자체에서 이러한 그림들을 간편하게 구현할 수 있는 기능이 향후에라도 지원되면 좋겠다는 생각이 듭니다.


오늘 사용했던 PLOT_POLAR_GRID_NG는 아래에 첨부합니다.


plot_polar_grid_ng.pro


plot_polar_grid_ng.pro
0.0MB
LIST