얼마전에 IDL/ENVI 유저 게시판에 질문으로 올라왔던 내용이었는데요. 두 종류의 서로 다른 데이터를 하나의 플롯상에서 중첩하여 표출하되 각 데이터에 해당되는 Y축을 왼쪽과 오른쪽에 별도로 두고자 한다면 어떻게 해야 하는가였습니다. 그래서 IDL/ENVI 유저 게시판에도 관련 답변 및 게시물이 올라왔기 때문에 충분한 답은 제공된 상태이고요. 사실 오늘 제가 여기 올리고자 하는 게시물의 내용도 유사한 주제를 다룹니다. 다만, 오늘 제가 보여드리는 예제는 얼마전 IDL/ENVI 유저 컨퍼런스에서 IDL의 리드 프로그래머인 Chris Torrence가 보여줬던 내용입니다. 그 때 Chris가 몇몇 예제들을 소개를 했었는데 아무래도 발표시간의 한계상 빠르게 지나간 측면이 좀 있어서, 그 예제들을 제가 순차적으로 이 블로그를 통하여 소개하고자 합니다. 물론 아주 자세하진 않지만 약간의 설명을 곁들여서 말이지요. 그 첫번째 순서로 오늘은 다중 축 플롯(Multi-Axis Plot)을 NG에서 그리는 예제를 소개합니다. 먼저 최종적인 결과 그림부터 보시면 다음과 같습니다.
이 그림을 그리기 위한 IDL 프로그램 및 데이터 파일도 위에 함께 첨부해 놓았습니다. 이 프로그램에서는 시간에 따른 풍향 및 풍속의 변화값들이 담긴 CDF 형식의 파일을 읽고 이 두 종류의 자료값들을 하나의 플롯상에 중첩하여 표출합니다. 그래서 시간에 해당되는 X축을 공유하는 풍향 및 풍속 값들이 두 개의 Y축으로 그려지게 됩니다. 프로그램에 대한 너무 자세한 설명은 생략하겠지만, 전체적인 흐름에서 중요한 부분만 짚어보기로 하겠습니다. 자세히 들여다보면 이 프로그램에서는 총 5단계에 걸쳐서 표출이 진행됩니다. 그 중 첫 단계의 내용을 보면 다음과 같습니다.
; Plot one dataset, choose speed. plot_margin = [0.15, 0.25, 0.15, 0.15] ; leave room for bottom & right axes p_wspd = plot(time, wspd, 'r', $ axis_style=1, $ ; make only x & y axes, not box axes margin=plot_margin, $ xrange=[0,24], $ xmajor=9, $ ; 3-hr intervals ymajor=6, $ dimensions=[700,600], $ ; embiggen window to fit extra axes name='Speed', $ xtitle='Time (UTC)', $ ytitle='Wind Speed ($m s^{-1}$)', $ title='NCAR Mesa Lab Weather Station Winds!C2013-06-03', $ buffer=0)
먼저 풍속에 해당되는 플롯을 그리게 되는데, 여기서 주목할 부분은 바로 AXIS_STYLE이라는 속성입니다. 우리가 흔히 보는 2차원 플롯들은 X, Y축 및 그 주변을 둘러싸는 하나의 박스 형태로 그려집니다. 이것은 AXIS_STYLE의 값이 디폴트 값인 2인 경우에 해당됩니다. 하지만 이 값을 위와 같이 1로 할 경우에는 X, Y축만 그립니다. 박스의 위와 오른쪽 선은 그려지지 않습니다. 따라서 여기까지만 진행된 상태에서는 그림이 다음과 같은 모습을 띄게 됩니다. 이렇게 그리는 이유는 오른쪽 부분에는 별도의 Y축을 그리기 위함입니다.
두번째 단계에서는 별도의 X축을 만들게 되는데요. 원래의 X축상의 시간이 국제표준시(Universal Time)였기 때문에 우리나라 시간(Local Time)에 해당되는 X축을 따로 그려주기 위한 것입니다. 이를 위하여 AXIS라는 함수가 사용이 되었습니다. 그리고 축의 위치를 LOCATION이라는 속성에서 어떻게 설정해주었는지 잘 눈여겨보면 됩니다. 이 두번째 단계에 해당되는 프로그램의 내용 및 여기까지 진행된 상태의 그림은 다음과 같습니다.
; Make a second x-axis for local time. local_time = strtrim(round(p_wspd.xtickvalues + 18) mod 24, 2) a_time = axis('x', $ tickname=local_time, $ location=[0,min(p_wspd.yrange)-3,0], $ ; data coordinates title='Time (LST)')
세번째 단계에서는 풍향에 해당되는 플롯을 기존의 플롯상에 겹쳐 그리게 됩니다. 그런데 그냥 일반적인 형태로 그리면 X, Y축이 또 그려져서 겹치게 되고 그러면 보기에 복잡해지기 때문에, 여기서는 축들을 모두 제외하고 순수하게 데이터 자체의 플롯(붉은색 선)만 그리게 됩니다. 이를 위하여 다음과 같이 이번에는 AXIS_STYLE의 값을 0으로 설정하였다는 점을 참조하면 됩니다. 그러면 이 단계까지 진행된 그림은 다음과 같은 모습을 띄게 됩니다.
p_wdir = plot(time, wdir, 'b', $ /current, $ axis_style=0, $ ; display no axes margin=plot_margin, $ ; need to use the same margin as above xrange=[0,24], $ ; and the same xrange yrange=[0,360], $ name='Direction')
네번째 단계에서는 풍향에 해당되는 Y축을 오른쪽 부분에 삽입하게 됩니다. 앞서 사용되었던 AXIS 함수가 또 등장하여 다음과 같이 별도의 Y축을 적절한 위치에 표출하게 됩니다. 여기까지 진행된 모습은 다음 그림과 같습니다.
; Make a second y-axis for the wind direction data. a_wdir = axis('y', $ target=p_wdir, $ major=5, $ ; [0, 90, 180, 270, 360] minor=2, $ location=[max(p_wdir.xrange),0,0], $ ; right axis, data coordinates textpos=1, $ ; text faces outward tickdir=1, $ ; ticks face inward title='Wind Direction (deg from N)')
이제 마지막 다섯번째 단계에서는 범례(Legend)를 우측 상단에 삽입하여, 각 플롯이 어느 데이터에 해당되는가를 표시해줍니다. 그리고 각 데이터에 해당되는 플롯의 선의 굵기를 조금 키운 후, 지금까지 표출된 내용을 PNG 형식의 그림파일로 저장하게 됩니다. 그러면 최종적인 모습은 앞서 맨 앞에서 보여드린 그림과 같게 됩니다.
; Display a legend for the two datasets in the default location. lgd = legend(target=[p_wspd, p_wdir], shadow=0, position=[0.99, 0.99]) p_wspd.thick = 2 p_wdir.thick = 2 p_wspd.save, 'figures/multiple_axes.png', width=700
아무래도 디폴트가 아닌 방법으로 표출을 하는 경우이다보니 여러 단계들을 거치게 되긴 하지만, 플롯이 축을 나타내는 원리를 이해하면 그리 어렵지 않게 그 요령을 터득할 수 있습니다. 이 방법을 잘 이해한다면 여러 종류의 데이터들을 중첩 표출하는 좀 더 다양한 시도들이 가능하다는 점 염두에 두시기 바랍니다.
'IDL > New Graphics' 카테고리의 다른 글
IDL에서 파이 차트(Pie Chart)를 그려봅시다 (0) | 2015.05.21 |
---|---|
NG 체계에서 그래픽 표출이 제대로 안될 경우의 조치법 (0) | 2015.03.23 |
LEGEND 함수의 효과적인 사용법 (0) | 2014.05.28 |
Ellipsoid를 그려봅시다 (0) | 2014.04.17 |
WIDGET_WINDOW 함수에서 배경색 설정 방법 (0) | 2014.03.26 |