날짜/시간 축 객체의 생성
IDL 사용자들이라면 2차원 플롯에서 축의 스케일이 날짜나 시간이 되어야하는 경우가 굉장히 많을 것이다. 여기서는 이러한 스케일의 축 객체를 생성 및 이용하는 방법을 한번 살펴보기로 한다. 먼저 예제 자료를 다음과 같이 생성한다.
ns = 360
times = TIMEGEN(ns, UNITS=‘minutes’, START=JULDAY(11, 15, 2010, 3, 0))
data = 200+100*SIN(100*!DTOR*FINDGEN(ns))
여기서는 예제자료로서 1분 간격으로 6시간 동안 측정된 data라는 실수 배열을 임의로 생성하였다. 물론 이에 대응되는 시간값 배열인 times라는 배열도 함께 생성하였으며, 그 갯수는 둘 다 360개가 될 것이다. 시간 범위는 임의로 2010년 11월 15일 03시부터 09시까지로 하였다. 이제 LABEL_DATE 함수를 사용하여 축 객체상에서 표시될 날짜/시간의 형식(format)을 다음과 같이 지정한다.
label_date = LABEL_DATE(DATE_FORMAT=[‘%H’])
여기서는 X축을 날짜/시간 스케일로 만들며, 큰 눈금의 간격은 시간(hour) 단위로 하는 것이 적당할 것이다. 따라서 ‘%H’를 사용하였다. 이제 다음과 같이 기본적으로 필요할 것 같은 객체들을 생성한다. 이제는 어떤 종류의 객체들이 필요할 것인지 서서히 감이 올 것이다.
oPlotWindow = OBJ_NEW(‘IDLgrWindow’, RETAIN=2, DIMENSION=[800,600])
oPlotView = OBJ_NEW(‘IDLgrView’, /DOUBLE)
oPlotModel = OBJ_NEW(‘IDLgrModel’)
oPlot = OBJ_NEW(‘IDLgrPlot’, times, data, /DOUBLE)
여기서 생성된 oPlotModel이라는 모델 객체에는 플롯 및 축 객체들이 포함될 것이다. 뷰 객체는 물론 모델 객체를 포함하게 된다. 여기서 뷰 객체인 oPlotView와 플롯 객체인 oPlot을 생성할 때 DOUBLE이라는 키워드가 있는 것을 볼 수 있다. 이는 시간/날짜라는 것이 기본적으로 Julian으로 표시되는데 이 값 자체가 2배정도(double precision) 실수이기 때문이다. 이제 다음과 같이 X, Y 축 객체의 적당한 범위를 설정해준다. 앞선 플롯 예제들에서는 플롯 객체로부터 범위 속성을 추출하여 이를 축 객체에 반영했지만, 실제 상황에서는 플롯을 그릴 때 적당할 것으로 생각되는 범위를 미리 정해두고 이를 축 객체에 바로 반영하는 경우가 더 많을 것이다.
xrn = [JULDAY(11,15,2010,3,0), JULDAY(11,15,2010,9,0)]
xs = NORM_COORD(xrn)
xs[0] = xs[0]-0.5
yrn = [0, 400]
ys = NORM_COORD(yrn)
ys[0] = ys[0]-0.5
oPlot -> SetProperty, XCOORD_CONV=xs, YCOORD_CONV=ys
여기서 사용된 NORM_COORD라는 함수는 0~1의 범위를 갖는(normalized) 좌표계를 만드는 역할을 한다(앞서 ‘객체의 변환’에 관한 내용에서 이미 언급되었으므로 그 내용을 참조한다). 여기서 생성한 뷰 객체가 X, Y 방향 모두 기본 설정인 -1.0~+1.0의 범위를 가지므로, NORM_COORD를 적용한 다음 0.5를 빼주어 가운데로 정렬하는 방식으로 좌표계를 맞춰주는 것이다. 이러한 좌표계는 축 객체들에 대해서도 동일하게 적용된다. 이러한 적용은 [XY]COORD_CONV라는 키워드를 통해서 이루어짐을 상기한다.
이제는 축 객체들을 생성한다. 이 때 각 방향 축마다의 타이틀 그리고 전체 타이틀에 해당되는 텍스트 객체들도 함께 생성한다. 이래야 좀 볼만한 플롯이 될 것이다.
oTextXAxis = OBJ_NEW(‘IDLgrText’, ‘Time (Hours)’)
oPlotXAxis = OBJ_NEW(‘IDLgrAxis’, 0, /EXACT, RANGE=xrn, XCOORD_CONV=xs, YCOORD_CONV=ys, $
TITLE=oTextXAxis, LOCATION=[xrn[0], yrn[0]], TICKDIR=0, TICKLEN=0.02*(yrn[1]-yrn[0]), $
TICKFORMAT=[‘LABEL_DATE’], TICKINTERVAL=1, MINOR=0, TICKUNITS=[‘Hour’])
oTextYAxis = OBJ_NEW(‘IDLgrText’, ‘Data (km/s)’)
oPlotYAxis = OBJ_NEW(‘IDLgrAxis’, 1, /EXACT, RANGE=yrn, XCOORD_CONV=xs, YCOORD_CONV=ys, $
TITLE=oTextYAxis, LOCATION=[xrn[0], yrn[0]], TICKDIR=0, TICKLEN=0.02*(xrn[1]-xrn[0]), MINOR=0)
oPlotText = OBJ_NEW(‘IDLgrText’, ‘Example Data Plot’, LOCATION=[(xrn[0]+xrn[1])/2, $
yrn[1]+0.05*(yrn[0]+yrn[1])], XCOORD_CONV=xs, YCOORD_CONV=ys, ALIGNMENT=0.5)
여기서 각 축 객체마다 LOCATION이라는 속성이 설정되는 것이 보이는데, 이것은 축 객체의 시작점의 위치를 나타내는 것이다. 따라서 그 위치는 당연히 각 축 객체마다의 범위의 첫번째 값들로 구성된 좌표가 될 것이다. 그리고 전체 타이틀에 해당되는 텍스트 객체인 oPlotText의 경우도 LOCATION 속성을 이용하여 화면상의 적당한 위치에 대한 좌표를 부여하였음을 유념한다.
이렇게 생성된 객체들을 모두 모델 객체안에 포함시키고, 나머지 필요한 계층구조 설정을 해준다. 그러면 다음 그림과 같이 X축이 시간 스케일로 된 2차원 플롯을 얻을 수 있다.
oPlotModel -> Add, oPlot
oPlotModel -> Add, oPlotXAxis
oPlotModel -> Add, oPlotYAxis
oPlotModel -> Add, oPlotText
oPlotView -> Add, oPlotModel
oPlotWindow -> Draw, oPlotView
그리고 깔끔한 마무리를 위하여 다음과 같이 더 이상 필요없는 객체들을 제거하도록 하자. 이렇게 하면 이미 그려진 그림은 남아있겠지만, 해당 객체들은 메모리상에서는 제거된다. 그래픽 디바이스 객체를 제외한 나머지들은 모두 제거하는 것이 바람직하다.
OBJ_DESTROY, [oPlotView, oPlotModel]
'IDL > Object Graphics' 카테고리의 다른 글
Object Graphics in IDL [31] (0) | 2011.04.05 |
---|---|
Object Graphics in IDL [30] (0) | 2011.03.21 |
Object Graphics in IDL [28] (0) | 2011.03.06 |
Object Graphics in IDL [27] (0) | 2011.02.25 |
Object Graphics in IDL [26] (0) | 2011.02.22 |