IDL/New Graphics

NG 체계에서 날짜 기반의 플롯 그리기

이상우_IDL 2013. 1. 2. 16:15
728x90

2013년의 새해가 밝았습니다. 우선 여기 방문해주시는 모든 분들 새해 복 많이 받으시길 기원합니다. 사실 2012년 한 해 동안 이 블로그가 그리 활발한 편은 아니었던 것 같습니다. 저 개인적으로 업무때문에 많이 신경을 못썼던 것이 사실이고요. 물론 2013년이라고 해서 크게 달라지지는 않을 것 같습니다. 하지만, 저도 주어진 여건내에서 최선을 다해서 블로그의 관리 및 내용 갱신 등에 주력하도록 하겠습니다. 그리고 간간이 있을 IDL 교육때에도 직접 뵐 수 있으면 좋을 것 같습니다.


올해 첫 게시물은 IDL의 NG(New Graphics) 체계에서 날짜 기반의 플롯을 그리는 방법을 예제와 함께 간략하게 다뤄보려고 합니다. 시간에 따라 변동하는 데이터의 모습을 그래프의 형태로 나타내는 것은 어느 분야에서든 필요한 작업이고, 따라서 IDL의 기존 DG(Direct Graphics) 체계에서도 잘 알려진 구현방법들은 존재합니다. 오늘은 NG 체계에서의 표출방법을 소개하고자 합니다. 이를 위한 예제 데이터는 지난 수백년간의 태양흑점의 갯수 변화 자료인데요. 아스키 형태로 된 이 자료파일은 spot_num.txt라는 이름으로 이 게시물에 첨부되어 있습니다. 파일의 내용을 들여다보면 1749년 1월부터 2012년 11월까지 월단위의 흑점 갯수값들이 존재합니다. 이 파일내의 컬럼의 순서는 년, 월, 흑점갯수가 됩니다. 따라서 가장 먼저 이 파일의 내용을 읽어서 배열의 형태로 인식시켜야 하는데요. 이를 위해서 다음과 같이 IDL Astro 라이브러리의 READCOL 명령을 사용하였습니다.


spot_num.txt


file = 'spot_num.txt'

READCOL, file, year, month, sunspots

HELP, sunspots


여기서는 year, month, sunspots라는 이름의 배열로 인식을 시켰습니다. 인식된 sunspots 배열의 구조를 HELP로 확인해보면 3167개의 원소를 갖는 배열로 나옵니다. 즉, 총 3167개월치의 데이터임을 확인할 수 있습니다. 이렇게 얻어진 sunspots는 플롯상의 Y축 데이터가 됩니다. 그러면 X축 데이터는 날짜가 되어야 하므로, 날짜 벡터를 생성해야 합니다. 다음과 같이 JULDAY 함수를 사용하여 Julian date 기반의 날짜값들로 이루어진 배열을 생성하면 됩니다. DG 체계에서도 마찬가지였지만 날짜 데이터는 이와 같이 Julian date 기반으로 사용하는 것이 통상적인 방법입니다.


tt = JULDAY(month, 1, year)


이제 그림을 실제로 그리기 위한 적당한 크기의 그래픽창을 WINDOW 함수로 띄웁니다. 그리고 바로 이어서 PLOT 함수를 사용하여 X축 및 Y축 데이터를 명시해주면 플롯을 그릴 수 있습니다. 여기서 PLOT 함수에서 XTICKUNITS라는 속성을 'year'로 설정한 것을 주목해야 하는데요. 도움말에서도 확인할 수 있지만, 이와 같이 설정하면 X축의 눈금값들을 Julian date 기반의 '년'으로 인식하게 됩니다. 물론 이 속성을 'month'로 설정하면 '월', 'day'로 설정하면 '일'로 인식하게 되는데, 이는 실제 데이터의 시간 스케일에 따라 적당히 선택하면 됩니다. 여기서는 '년'으로 하는 것이 맞겠죠. 어쨌든 이와 같이 그려본 결과는 다음 그림과 같습니다.


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

pl = PLOT(tt, sunspots, XTICKUNITS='year', XTITLE='Year', YTITLE='Count', TITLE='Sunspot Activity', COLOR='blue', /CURRENT)



아직 이 그림에서는 X축의 범위나 눈금 간격을 IDL이 적당히 알아서 잡아준 상태입니다. 물론 사용자가 직접 설정할 수도 있습니다. 먼저 축의 범위를 XRANGE 속성으로 설정하기 위하여 X축 범위의 시작값과 끝값을 다음과 같이 정의해보았습니다. 그리고 위의 PLOT 함수의 내용도 이에 맞게 수정하였습니다. 그 내용은 아래와 같습니다.


xr1 = JULDAY(1, 1, 1740, 0)

xr2 = JULDAY(1, 1, 2020, 0)

pl = PLOT(tt, sunspots, XRANGE=[xr1, xr2], XTICKUNITS='year', XTICKINTERVAL=40, XMINOR=3, $

  XTITLE='Year', YTITLE='Count', TITLE='Sunspot Activity', COLOR='blue', /CURRENT)


여기서는 X축의 범위를 1740년에서 2020년까지로 그리고 눈금 간격은 40년으로 설정하였습니다. 그리고 minor 눈금은 10년 단위로 설정한 것입니다. 이와 같이 그려본 그림은 아래와 같습니다.



그리고 현재 갖고 있는 데이터에 대하여 특정한 시간 범위를 골라서 표출할 수도 있습니다. 예를 들어, 1960년부터 2020년까지로 범위를 좁게 하여 그리려면 다음과 같이 하면 됩니다. 그 결과는 아래 그림과 같습니다.


xr1 = JULDAY(1, 1, 1960, 0)

xr2 = JULDAY(1, 1, 2020, 0)

pl = PLOT(tt, sunspots, XRANGE=[xr1, xr2], XTICKUNITS='year', XTICKINTERVAL=10, XMINOR=3, $

  XTITLE='Year', YTITLE='Count', TITLE='Sunspot Activity', COLOR='blue', /CURRENT)



그리고 이렇게 그려진 그림을 그림파일로 저장하려면 다음과 같이 Save 메서드를 사용하면 됩니다. 그림이 표출된 가장 기본 단위는 여기서는 win이란 이름으로 구현되어 있는 그래픽창이므로, 이 내용을 그대로 다음과 같은 요령으로 그림파일로 저장하면 됩니다. 여기서는 PNG 형식으로 저장해보았습니다. 지금 이 게시물에 보이는 그림들도 다 이와 같은 방식으로 저장된 것들입니다.

win.Save, 'spot_num.png', RESOLUTION=96

이와 같이, 날짜 기반의 데이터를 NG 체계에서 표출하는 방식을 예제를 통하여 간략하게 살펴보았습니다. DG 체계에서의 방식과 비교해서도 특별히 더 복잡하거나 어려울 것은 없습니다.

spot_num.txt
0.06MB
LIST