지난 시간에 이어서 오늘은 실제 플롯을 그리는 부분을 소개하고자 합니다. 원시자료에 해당되는 파일들을 다운로드하는 부분은 지난 시간에 소개를 했는데, 이 기능에 의하여 다운로드받은 파일들의 이름은 다음과 같습니다. 제가 이 글을 쓰고 있는 이 시간 현재의 날짜가 UT로 2011년 12월 19일입니다. 그래서 다음과 같이 최근 5일치의 파일들을 다운로드하게 됩니다.
20111215_Gp_xr_5m.txt
20111216_Gp_xr_5m.txt
20111217_Gp_xr_5m.txt
20111218_Gp_xr_5m.txt
20111219_Gp_xr_5m.txt
이제는 다운로드받은 이와 같은 파일들의 내용을 읽어야 합니다. 실제로 각각의 원시자료파일의 내용을 보면 다음과 같은 모습을 하고 있습니다.
맨 앞부분은 헤더로서 19개의 줄을 차지합니다. 그래서 이 부분은 제외하고 그 뒤에 이어지는 컬럼들을 읽어야 합니다. 총 9개의 컬럼들이 있는데, 실제로 필요한 부분은 날짜 및 시간에 해당되는 1, 2, 3, 4번째 컬럼들(YR, MO, DA, HHMM) 그리고 자료값에 해당되는 7, 8번째 컬럼들(Short, Long)을 읽게 됩니다. 이와 같은 방식으로 5일치의 파일들 모두를 읽어서 날짜정보, 자료값1, 자료값2에 해당되는 배열을 구성해야 합니다. 그래서 각각에 해당되는 times, xsh, xlo 세 개의 배열들을 얻습니다. 루틴상에서 이 부분은 다음과 같습니다.
ss = ''
times = []
xsh = []
xlo = []
FOR i = 0, ndays-1 DO BEGIN
nn = FILE_LINES(ifiles[i]) - N_ELEMENTS(header)
OPENR, lun, ifiles[i], /GET_LUN
READF, lun, header
FOR hi = 0, nn-1 DO BEGIN
READF, lun, ss
spl = STRSPLIT(ss, ' ', /EXTRACT)
times = [times, JULDAY(FIX(spl[1]), FIX(spl[2]), FIX(spl[0]), FIX(STRMID(spl[3], 0, 2)), FIX(STRMID(spl[3], 2, 2)), 0)]
xsh = [xsh, FLOAT(spl[6])]
xlo = [xlo, FLOAT(spl[7])]
ENDFOR
FREE_LUN, lun
ENDFOR
ms = WHERE(xsh LT -10000, count)
IF count NE 0 THEN xsh[ms] = !values.f_nan
ms = WHERE(xlo LT -10000, count)
IF count NE 0 THEN xlo[ms] = !values.f_nan
여기서 앞부분을 보면 times, xsh, xlo 배열들을 미리 null 배열로 선언해 놓습니다. 그리고 5개의 파일들에 대한 반복문이 나오고, 그 안에는 또 각 파일의 전체 줄수에 해당되는 반복문이 나옵니다. 각 파일별로 보면 헤더에 해당되는 부분은 읽기만 넘어갑니다. 그리고 컬럼들이 나오면 필요한 부분들만 골라내어 각 배열에 축적하는 방식으로 진행됩니다. 이렇게 2중으로 구성된 반복문이 모두 종료된 후에는, xsh 및 xlo에 대하여 의미없는 값들을 WHERE 함수로 추려서 이 값들을 NaN으로 대체합니다. 이렇게 해야 나중에 플롯을 그릴 때 이 부분은 그리지 않도록 할 수 있기 때문입니다.
이제는 이렇게 얻어진 times, xsh, xlo 배열들을 갖고 그림을 그립니다. 루틴상의 내용을 보면 다음과 같습니다.
color1 = 'Crimson'
color2 = 'Deep Sky Blue'
xrn = [JULDAY(mo[0], da[0], yr[0], 0, 0), JULDAY(mo[ndays-1], da[ndays-1], yr[ndays-1], 24, 0)]
yrn = [1e-9, 1e-2]
dummy = LABEL_DATE(DATE_FORMAT=['%M%D'])
win = WINDOW(DIMENSIONS=[500, 400])
plot0 = PLOT(times, xlo, FONT_STYLE=1, /NODATA, /CURRENT, XTITLE='Time (UT)', YTITLE='Flux (W/m!e2!n)', $
XRANGE=xrn, XTICKLEN = 7, XGRIDSTYLE=1, XMINOR=0, XTICKFORMAT = ['LABEL_DATE'], XTICKINTERVAL = 1, $
XTICKUNITS = ['Day'], YRANGE=yrn, YTICKLEN = ndays, YGRIDSTYLE=1, YMINOR=0, /YLOG)
plot1 = PLOT(times, xlo, COLOR=color1, /OVERPLOT)
plot2 = PLOT(times, xsh, COLOR=color2, /OVERPLOT)
여기서 세번째 줄에 있는 xrn = ~~~에 해당되는 부분은 X축의 범위를 정하는 역할인데 여기에 나오는 변수들은 제가 소개하지 않는 부분에서 산출된 것이므로 그냥 자세한 언급은 생략하겠습니다. 플롯은 이미 언급했다시피 New Graphics 체계로 그려지므로 위와 같이 WINDOW, PLOT과 같은 함수들이 사용되었습니다. PLOT 함수의 경우 세번에 걸쳐 사용되는데, 첫번째 plot0의 경우는 자료값은 그리지 않고(/NODATA 키워드 사용), 그냥 플롯의 바탕이 되는 X, Y축 및 각 축의 타이틀 정도만 명시합니다. 그리고 뒤에 이어지는 plot1, plot2가 실제 자료값 배열인 xlo, xsh에 해당되는 플롯이 됩니다.
물론 여기까지가 다는 아닙니다. 만약 여기까지만 하고 그림을 그리면 다음과 같이 뭔가 좀 허전한 그림이 나올겁니다.
사실은 플롯 자체외에도 그 주변부에 있는 각종 보조문자 및 보조선들도 있습니다. 이러한 것들은 다음과 같이 TEXT 또는 POLYLINE 함수로 그려집니다.
box = POLYLINE([xrn[0], xrn[1], xrn[1], xrn[0], xrn[0]], [yrn[0], yrn[0], yrn[1], yrn[1], yrn[0]], /DATA)
class_str1 = TEXT(xrn[1] + 1e-8*(xrn[0] + xrn[1]), 10^(-3.5), 'X', VERTICAL_ALIGNMENT=0.5, COLOR='Magenta', /DATA)
class_str2 = TEXT(xrn[1] + 1e-8*(xrn[0] + xrn[1]), 10^(-4.5), 'M', VERTICAL_ALIGNMENT=0.5, COLOR='Magenta', /DATA)
class_str3 = TEXT(xrn[1] + 1e-8*(xrn[0] + xrn[1]), 10^(-5.5), 'C', VERTICAL_ALIGNMENT=0.5, COLOR='Magenta', /DATA)
class_str4 = TEXT(xrn[1] + 1e-8*(xrn[0] + xrn[1]), 10^(-6.5), 'B', VERTICAL_ALIGNMENT=0.5, COLOR='Magenta', /DATA)
class_str5 = TEXT(xrn[1] + 1e-8*(xrn[0] + xrn[1]), 10^(-7.5), 'A', VERTICAL_ALIGNMENT=0.5, COLOR='Magenta', /DATA)
legend_text1 = TEXT(0.99, 0.70, '1.0 - 8.0 A', BASELINE=[0, 1], UPDIR=[-1, 0], FONT_SIZE=10, /NORMAL)
legend_text2 = TEXT(0.99, 0.30, '0.5 - 4.0 A', BASELINE=[0, 1], UPDIR=[-1, 0], FONT_SIZE=10, /NORMAL)
legend_line1 = POLYLINE([0.98, 0.98], [0.55, 0.69], COLOR=color1, THICK=2, /NORMAL)
legend_line2 = POLYLINE([0.98, 0.98], [0.15, 0.29], COLOR=color2, THICK=2, /NORMAL)
title = TEXT(0.5, 0.93, 'Solar X-Ray Flux : GOES-14 (5 min)', COLOR='Indigo', FONT_SIZE=18, ALIGNMENT=0.5, /NORMAL)
maker = TEXT(0.01, 0.01, '(c) SELab, Inc. '+STRTRIM(yr[ndays-1], 2), COLOR='Dark Green', FONT_SIZE=9, /NORMAL)
이와 같이 그려진 그림의 모습은 다음과 같습니다. 물론 루틴내에서는 다음과 같이 Save 메서드를 사용하여 PNG 형식의 그림파일로 저장됩니다.
win.SAVE, 'x5.png', RESOLUTION=96
그외에도 이렇게 저장된 그림파일을 다시 웹서버상으로 업로드하는 과정을 비롯한 운용상 필요한 부분들도 있지만 여기서는 이러한 부분들에 대한 내용은 생략하기로 하겠습니다. 대략적으로 이와 같은 과정을 통하여 SWx Monitor상의 그림들이 그려진다는 정도로만 소개할까 합니다. SWx Monitor상의 다른 플롯그림들을 생성하는 루틴들도 각 자료파일의 특성에 따른 부분들만 다를 뿐 전반적으로는 이와 같은 흐름을 띄고 있습니다.
'IDL > New Graphics' 카테고리의 다른 글
플롯상의 각 점들을 서로 다른 색상으로 표출하는 방법 [1] (2) | 2012.07.02 |
---|---|
영상의 화소값을 도식적으로 표출해보자~ (0) | 2011.12.21 |
SWx Monitor의 플롯 생성 루틴 소개 [1] (0) | 2011.12.15 |
New Graphics에서 사용 가능한 컬러 목록 보기 (버전 수정) (0) | 2011.11.28 |
PostScript에서 플롯과 이미지를 함께 표출하기[2] (0) | 2011.11.14 |