O IDL (sigla de Interactive Data Language) é uma linguagem de programação cientifica utilizada nas mais diversas áreas de pesquisa, conforme falado no post anterior sobre IDL. A saída gráfica do programa utiliza janelas (“windows”) para exibir seu conteúdo, cada uma identificada por um número. Seu tamanho e posição podem ser especificados, conforme o exemplo a seguir:
IDL> window, 0, xsize = 300, ysize = 400, xpos = 300, ypos = 400
Para fazer o gráfico mesmo sem criar a “window”, deve ser utilizado o “Z graphics buffer”, especificando a resolução utilizando o comando “device”:
thisDevice = !D.Name Set_Plot, 'Z' Erase Device, Set_Resolution=[300,400], Z_Buffer=0
PLOT é a rotina que irá plotar dois vetores de mesmo tamanho entre si (ou somente um vetor, com o eixo x sendo uma sequência numerada). Os parâmetros incluem: title, xtitle e ytitle (títulos), xrange e yrange (determina valores máximos e força escala), psym (símbolo), color e outros. Veja mais propriedades de gráficos no site da Exelis.
Também é possível plotar gráficos de superfície (procedimento SURFACE, parâmetros az e ax para rotacionar), com linhas ou com preenchimento (SHADE_SURF), e gráficos de contorno (procedimento CONTOUR, opções xstyle, ystyle e nlevels, que fixa o número de níveis, e palavra chave FOLLOW para imprimir os valores do contorno).
Comparação de dados
Suponha a seguinte tarefa: comparar dados de uma mesma variável, obtida nas mesmas condições, mas por diferentes instrumentos. Uma sugestão é começar fazendo séries temporais dos valores obtidos pelo instrumento de referência e do instrumento a ser comparado em um mesmo gráfico. Desse modo, pode-se visualizar a disposição temporal dos valores obtidos. Posteriormente, fazer outro gráfico com os dados do sensor teste versus sensor de referência. Outra opção é calcular as diferenças para os dados medidos simultaneamente e construir um histograma dessas diferenças. Desse modo, é possível visualizar a distribuição de frequência dessas diferenças e determinar o bias (ou viés), que é a tendência que os valores obtidos pelo instrumento assumem quando comparados ao instrumento de referência (como superestimar ou subestimar, por exemplo).
Segue um exemplo para plotar diferentes series temporais no mesmo gráfico para comparação. Essa rotina funciona para um instrumento de referência e dois instrumentos a serem comparados, onde cada equipamento é uma sequência no gráfico (Vermelho: referência, Verde: sensor1 e Preto: sensor2). Os dados de entrada devem estar separados em arquivos diários, com o nome no formato “nome_do_sensor_anomesdia.dat”, com médias a cada cinco minutos. Mesmo que dados não correspondam aos mesmos instantes temporais, ou seja, tenham falhas, o script somente plota os pontos que estejam nos arquivos.
São produzidos um gráfico para cada dia e para cada uma das seguintes variáveis: Temperatura do ar, Umidade Relativa, Pressão, Precipitação, Precipitação acumulada, Velocidade média do vento, Velocidade máxima do vento, Direção média do vento, Direção máxima do vento. Nem todas as variáveis são obtidas por todos os equipamentos.
@converte dir_sensores = ['arq_diarios/files_sensor1/','arq_diarios/files_sensor2/'] dir_referencia = 'arq_diarios/files_referencia/' for ano=2013,2014 do begin for mes=1,12 do begin for dia=1,31 do begin converte,mes,mm$ converte,dia,dd$ yymmdd$=strmid(ano,4,4) + '-' + mm$ + '-' + dd$ flag = intarr(3) result=strarr(2) result_referencia = findfile(dir_referencia + '*' + yymmdd$ + '.dat',count=preferencia) for i=0,1 do begin result(i) = findfile(dir_sensores(i) + '*' + yymmdd$ + '.dat',count=p1) flag(i) = p1 endfor ;Comparar sensores com referencia, caso tenha dados dele if total(flag) gt 0 and preferencia eq 1 then begin print,result nlines = intarr(3) nome_var = strarr(10) nome_var = ['Tempo','Temperatura_do_ar','UR','Pressao','Precipitacao','Precipitacao_acumulada','Velocidade_media','Velocidade_maxima','Direcao_media','Direcao_maxima'] ;Montar vetor com dados referencia CLOSE,1 OPENR,1,result_referencia nlines(0) = FILE_LINES(result_referencia) julian = 0.0d referencia = FLTARR(10,nlines(0)) serie_tempox = DBLARR(nlines(0)) i=0 while eof(1) eq 0 do begin ;2013-11-01 20:30,20.59,82.42,931.4610,0,0,1.10,8.94,104.17,104.12 ;Tempo | Temperatura | UR | Pressão | Precipitação | Precipitação acumulada | Vel média | vel máx | Direção média | Direção máxima READF,1, format='(i4,4(1x,i2),9(1x,f0))',a,m,d,hh,min,tar,ur,p,ppt,pptacum,velmed,velmax,dirmed,dirmax ;converte data pra JULDAY+fracao_do_dia serie_tempox(i) = JULDAY(m,d,a,hh,min,0) referencia(0,i)=serie_tempox(i) referencia(1,i)=tar referencia(2,i)=ur referencia(3,i)=p referencia(4,i)=ppt referencia(5,i)=pptacum referencia(6,i)=velmed referencia(7,i)=velmax referencia(8,i)=dirmed referencia(9,i)=dirmax i=i+1 endwhile CLOSE,1 ;print,referencia ;print,'----------------------------------------------------------' ;Montar vetor com dados sensor1 CLOSE,2 OPENR,2,result(0) nlines(1) = FILE_LINES(result(0)) sensor1 = FLTARR(10,nlines(1)) serie_tempoh = DBLARR(nlines(1)) i=0 while eof(2) eq 0 do begin ;2013-11-09 00:00,18.16904,76.0881,0,NA ;Tempo | Temperatura | UR | Precipitação | Precipitação acumulada READF,2, format='(i4,4(1x,i2),4(1x,f0))',a,m,d,hh,min,tar,ur,ppt,pptacum ;print,a,m,d,hh,min,tar,ur,ppt,pptacum ;converte data pra JULDAY+fracao_do_dia serie_tempoh(i) = JULDAY(m,d,a,hh,min,0) sensor1(0,i)=serie_tempoh(i) sensor1(1,i)=tar sensor1(2,i)=ur sensor1(3,i)=p sensor1(4,i)=ppt sensor1(5,i)=pptacum sensor1(6,i)=0 sensor1(7,i)=0 sensor1(8,i)=0 sensor1(9,i)=0 i=i+1 endwhile CLOSE,2 ;print,sensor1 ;print,'----------------------------------------------------------' ;Montar vetor com dados sensor2 CLOSE,3 OPENR,3,result(1) nlines(2) = FILE_LINES(result(1)) sensor2 = FLTARR(10,nlines(2)) serie_tempo = DBLARR(nlines(2)) i=0 while eof(3) eq 0 do begin ;2013-11-01 14:25,21.8,64.5,934,NA,2.1,5,163,243 ;Tempo | Temperatura | UR | Pressão | Precipitação | Vel média | Vel máx | Direção média | Direção máx READF,3, format='(i4,4(1x,i2),8(1x,f0))',a,m,d,hh,min,tar,ur,p,ppt,velmed,velmax,dirmed,dirmax ;print,a,m,d,hh,min,tar,ur,p,ppt,velmed,velmax,dirmed,dirmax ;converte data pra JULDAY+fracao_do_dia serie_tempo(i) = JULDAY(m,d,a,hh,min,0) sensor2(0,i)=serie_tempo(i) sensor2(1,i)=tar sensor2(2,i)=ur sensor2(3,i)=p sensor2(4,i)=ppt sensor2(5,i)=0 sensor2(6,i)=velmed sensor2(7,i)=velmax sensor2(8,i)=dirmed sensor2(9,i)=dirmax i=i+1 endwhile CLOSE,3 ;print,serie_tempo, format='(d14.6)' ;print,'----------------------------------------------------------' ;Plotar grafico diario: 3 series x tempo para cada variavel ;Limites eixo y ymin = [0,10,0,920,0,0,0,0,0,0] ymax = [0,40,100,950,5,1,30,50,400,400] units = ['tempo',' (oC)',' (%)',' (hPa)',' (mm)',' (mm)',' (m/s)',' (m/s)',' (o)',' (o)'] for i=1,9 do begin serie_referencia = referencia(i,*) serie_sensor1 = sensor1(i,*) serie_sensor2 = sensor2(i,*) device,decomposed=0 window,0,XSIZE=800,YSIZE=300 tvlct,0,255,0, 1 ;cor 1 = verde tvlct,255,0,0, 2 ;cor 2 = vermelho tvlct,0,0,255, 3 ;cor 3 = azul date_label = LABEL_DATE( DATE_FORMAT=['%M-%D!C%H:%I'] ) plot,serie_tempo,serie_sensor2,$ XTICKFORMAT='LABEL_DATE',XTICKUNITS='Time',title=nome_var(i)+' '+yymmdd$,$ XCHARSIZE=1.3,YCHARSIZE=1.3,YTITLE=nome_var(i)+units(i),$ BACKGROUND=255,COLOR=0,LINESTYLE = 1, THICK = 2, psym = 2, YRANGE = [ymin(i), ymax(i)] oplot,serie_tempoh,serie_sensor1,LINESTYLE = 0, THICK = 2, color = 1, psym = 1 ;cruz oplot,serie_tempox,serie_referencia,LINESTYLE = 5, THICK = 2, color = 2, psym = 4 ;diamond write_png,nome_var(i)+'_'+yymmdd$+'.png',tvrd(true=1) ;stop endfor endif endfor endfor endfor end
Observações:
– O primeiro gráfico plotado define a grade e os limites, então assume-se que o sensor cujos dados possuem a série temporal “serie_tempo” seja o mais completa o possível.
– O comando tvlct define as cores a partir do RGB, e oplot permite plotar mais de uma sequência de dados em um mesmo gráfico.
– A rotina “converte.pro”, chamada no início do script, é utilizada para incluir um zero antes do número (transforma mês 5 em 05, por exemplo), conforme segue abaixo:
pro converte,dia,dd$ if dia lt 10 then begin dd$ = '0' + strmid(fix(dia),7,1) endif else begin dd$ = strmid(fix(dia),6,2) endelse return end
A seguir, um exemplo de gráfico impresso pela rotina apresentada acima:
Muito do algoritmo utilizado no exemplo anterior é utilizado para montar os histogramas. São construídos um gráfico para cada variável, utilizando toda a série temporal.
@converte ;histograma das diferenças entre as medidas dos sensores em instantes coincidentes nome_var = strarr(10) nome_var = ['Tempo','Temperatura_do_ar','UR','Pressao','Precipitacao','Precipitacao_acumulada',$ 'Velocidade_media','Velocidade_maxima','Direcao_media','Direcao_maxima'] units = ['tempo',' (oC)',' (%)',' (hPa)',' (mm)',' (mm)',' (m/s)',' (m/s)',' (o)',' (o)'] dir_sensores = ['arq_diarios/files_sensor1/','arq_diarios/files_sensor2/'] dir_referencia = 'arq_diarios/files_referencia/' ;Loop envolvendo variaveis for var=1,9 do begin nlines = 100000 dif_r1 = DBLARR(2,nlines) dif_r2 = DBLARR(2,nlines) dif_12 = DBLARR(2,nlines) conth=0 contw=0 conthw=0 for ano=2013,2014 do begin for mes=1,12 do begin for dia=1,31 do begin converte,mes,mm$ converte,dia,dd$ yymmdd$=strmid(ano,4,4) + '-' + mm$ + '-' + dd$ flag = intarr(3) result=strarr(2) result_referencia = findfile(dir_referencia + '*' + yymmdd$ + '.dat',count=preferencia) for i=0,1 do begin result(i) = findfile(dir_vaisala(i) + '*' + yymmdd$ + '.dat',count=p1) flag(i) = p1 endfor ;Comparar sensores com referencia, caso tenha dados dele if total(flag) gt 0 and preferencia eq 1 then begin print,result nlines = intarr(3) ;Montar vetor com dados referencia CLOSE,1 OPENR,1,result_referencia nlines(0) = FILE_LINES(result_referencia) julian = 0.0d referencia = FLTARR(10,nlines(0)) serie_tempox = DBLARR(nlines(0)) i=0 while eof(1) eq 0 do begin ;2013-11-01 20:30,20.59,82.42,931.4610,0,0,1.10,8.94,104.17,104.12 ;Tempo | Temperatura | UR | Pressão | Precipitação | Precipitação acumulada | Vel média | vel máx | Direção média | Direção máxima READF,1, format='(i4,4(1x,i2),9(1x,f0))',a,m,d,hh,min,tar,ur,p,ppt,pptacum,velmed,velmax,dirmed,dirmax ;converte data pra JULDAY+fracao_do_dia serie_tempox(i) = JULDAY(m,d,a,hh,min,0) referencia(0,i)=serie_tempox(i) referencia(1,i)=tar referencia(2,i)=ur referencia(3,i)=p referencia(4,i)=ppt referencia(5,i)=pptacum referencia(6,i)=velmed referencia(7,i)=velmax referencia(8,i)=dirmed referencia(9,i)=dirmax i=i+1 endwhile CLOSE,1 ;Montar vetor com dados sensor1 CLOSE,2 OPENR,2,result(0) nlines(1) = FILE_LINES(result(0)) sensor1 = FLTARR(10,nlines(1)) serie_tempoh = DBLARR(nlines(1)) i=0 while eof(2) eq 0 do begin ;2013-11-09 00:00,18.16904,76.0881,0,NA ;Tempo | Temperatura | UR | Precipitação | Precipitação acumulada READF,2, format='(i4,4(1x,i2),4(1x,f0))',a,m,d,hh,min,tar,ur,ppt,pptacum ;print,a,m,d,hh,min,tar,ur,ppt,pptacum ;converte data pra JULDAY+fracao_do_dia serie_tempoh(i) = JULDAY(m,d,a,hh,min,0) sensor1(0,i)=serie_tempoh(i) sensor1(1,i)=tar sensor1(2,i)=ur sensor1(3,i)=p sensor1(4,i)=ppt sensor1(5,i)=pptacum sensor1(6,i)=0 sensor1(7,i)=0 sensor1(8,i)=0 sensor1(9,i)=0 i=i+1 endwhile CLOSE,2 ;Montar vetor com dados sensor2 CLOSE,3 OPENR,3,result(1) nlines(2) = FILE_LINES(result(1)) sensor2 = FLTARR(10,nlines(2)) serie_tempow = DBLARR(nlines(2)) i=0 while eof(3) eq 0 do begin ;2013-11-01 14:25,21.8,64.5,934,NA,2.1,5,163,243 ;Tempo | Temperatura | UR | Pressão | Precipitação | Vel média | Vel máx | Direção média | Direção máx READF,3, format='(i4,4(1x,i2),8(1x,f0))',a,m,d,hh,min,tar,ur,p,ppt,velmed,velmax,dirmed,dirmax ;print,a,m,d,hh,min,tar,ur,p,ppt,velmed,velmax,dirmed,dirmax ;converte data pra JULDAY+fracao_do_dia serie_tempow(i) = JULDAY(m,d,a,hh,min,0) sensor2(0,i)=serie_tempow(i) sensor2(1,i)=tar sensor2(2,i)=ur sensor2(3,i)=p sensor2(4,i)=ppt sensor2(5,i)=0 sensor2(6,i)=velmed sensor2(7,i)=velmax sensor2(8,i)=dirmed sensor2(9,i)=dirmax i=i+1 endwhile CLOSE,3 serie_referencia = referencia(var,*) serie_sensor1 = sensor1(var,*) serie_sensor2 = sensor2(var,*) for k=0,nlines(1)-1 do begin pos = where(serie_tempox eq serie_tempoh(k),npts) if npts gt 0 then begin j = pos dif_r1(0,conth)=serie_tempox(j) dif_r1(1,conth)=referencia(var,j)-sensor1(var,k) conth = conth + 1 endif endfor ;Busca valores do sensor2 para cada j valor da referencia for k=0,nlines(2)-1 do begin pos = where(serie_tempox eq serie_tempow(k),npts) if npts gt 0 then begin j = pos dif_r2(0,contw)=serie_tempox(j) dif_r2(1,contw)=referencia(var,j)-sensor2(var,k) contw=contw+1 endif endfor ;Busca valores do sensor1 e sensor2 para cada j valor da referencia for k=0,nlines(0)-1 do begin posw = where(serie_tempow eq serie_tempox(k),nptsw) posh = where(serie_tempoh eq serie_tempox(k),nptsh) if npts gt 0 then begin dif_12(0,conthw)=serie_tempox(k) dif_12(1,conthw)=sensor1(var,posh)-sensor2(var,posw) conthw=conthw+1 endif endfor ;Termina comparação sensores com referencia, caso tenha dados dele endif endfor endfor endfor dif_r1 = dif_r1(*,0:conth-1) dif_r2 = dif_r2(*,0:contw-1) dif_12 = dif_12(*,0:contw-1) ymin = [0,-2,-10,-10,-1,-1,-20,-20,-100,-100] ymax = [0,+2,+10,+10,+1,+1,+20,+20,+100,+100] bvar = [0,0.1,0.5,0.5,0.01,0.01,0.5,0.5,1,1] units = ['tempo',' (oC)',' (%)',' (hPa)',' (mm)',' (mm)',' (m/s)',' (m/s)',' (o)',' (o)'] npts = fix((ymax(var)-ymin(var))/bvar(var)) + 1 xdif = findgen(npts)*bvar(var) + ymin(var) histo_r1 = histogram(dif_xh,min=ymin(var),max=ymax(var),bin=bvar(var)) histo_r1 = histogram(dif_xw,min=ymin(var),max=ymax(var),bin=bvar(var)) histo_12 = histogram(dif_hw,min=ymin(var),max=ymax(var),bin=bvar(var)) device,decomposed=0 window,0,XSIZE=800,YSIZE=600 !p.multi=[0,1,3] plot,xdif,histo_r1,xtitle=nome_var(var)+units(var),title='Referencia-Sensor1',CHARSIZE=2,BACKGROUND=255,COLOR=0 plot,xdif,histo_r2,xtitle=nome_var(var)+units(var),title='Referencia-Sensor2',CHARSIZE=2,BACKGROUND=255,COLOR=0 plot,xdif,histo_12,xtitle=nome_var(var)+units(var),title='Sensor1-Sensor2',CHARSIZE=2,BACKGROUND=255,COLOR=0 write_png,'Histo_'+nome_var(var)+'.png',tvrd(true=1) endfor end
A seguir, um exemplo de gráfico impresso pela rotina apresentada acima:
Veja também o primeiro post sobre IDL.
One comment