;------------------------------------------------------------ ;+ ; NAME: ; PLTTG ; ; PURPOSE: ; trace des graphes hovmoller avec axe generalise ; ; CATEGORY: ; Graphics, trace des graphes hovmoller: gt ; ; CALLING SEQUENCE: ; plttg, champ,gaxis [,min[, max[, datmin[, datmax]]]] ; ; INPUTS: ; champ: le champ dont on veut faire le hovmoller champ ; peut etre de 2 types: ; 1) un tableu qui peut etre: ; * 3d ou 4d: la derniere composante etant le temps. dans ce ; cas, le tableau va passer dans grossemoyenne pour etre ; moyennee suivant et devenir un tableau 2d ou 1d. ; * 2d: si tableau est deja 2d, il n''est pas modifie ; (attention les terres doivent etre masquees a la valeure ; valmask) et type doit qd meme etre specifie pour qu''on ; sache de quel trace il sagit. Pour avoir une legende ; correcte, respecifier la zone d''extraction via BOITE ; * 1d: uniquement pour les traces de type 't'. Type doit qd ; meme etre specifie pour qu''on sache de quel trace il ; sagit. Pour avoir une legende correcte, respecifier la zone ; d''extraction via BOITE ; 2) une structure repondant aux critaire specifies par ; litchamp.pro. cf. IDL> xhelp,'litchamp'. Le tableau contennu ds ; la structure repondant aux criteres du cas 1) cf. ci-dessus ; ; TYPE: type de hovmoller que l''on veut faire: ; 'yt' only ; ; ces arguments ne sont pas obligatoires: ; ; MAX: valeur maximum que l''on veut prendre en compte dans le trace ; des contours. Par defaut on prend le max de tableau (sur les pts mer) ; ; MIN: valeur minimum que l''on veut prendre en compte dans le trace ; des contours. Par defaut on prend le min de tableau (sur les pts ; mer) ; ; DATMIN: c''est la borne inf de l''axe temporel. c''est un ; longinteger de la forme yyyymmdd (ou bien yymmdd). ; ; DATMAX: c''est la borne max de l''axe temporel. c''est un ; longinteger de la forme yyyymmdd (ou bien yymmdd) ; ; KEYWORD PARAMETERS: ; ; BOITE:vecteur indiquant la zone geographique (3d) sur laquelle doit ; etre fait l''extraction du champ pour faire le hovmoeller. ; Si BOITE a : ; 1 element : l''extraction est faite sur [lon1, lon2, lat1, lat2, 0.,boite[0]] ; 2 elements: l''extraction est faite sur [lon1, lon2, lat1, lat2, boite[0],boite[1]] ; 4 elements: l''extraction est faite sur [Boite, prof1, prof2] ; 5 elements: l''extraction est faite sur [Boite[0:3], 0, Boite[4]] ; 6 elements: l''extraction est faite sur Boite ; ; Ou lon1, lon2,lat1,lat2,prof1,prof2 sont les variables globales ; definies lors du dernier domdef! ; ; CB_TITLE: le titre de la colorbar ; ; CB_SUBTITLE: le soustitre de la colorbar ; ; CB_CHARSIZE: The character size of the color bar annotations ; ; CONTINTERVALLE: lorsque CONTOUR est active, valeur d''un ; intervalle entre deux isolignes traces par un trait ds la couleur ; c_lab. Il peut ainsi etre different de celui specifie par INTERVALLE ; qui, cas ce cas, ne controle que les isolignes coloriees en ; couleurs. Si aucun min n''est specifie, on choisit un contour min qui va ; bien avec l''intervalle specifie!. Si ce mot cle n''est pas ; specifie, on trace 20 isolignes du min au max. ; ; CONTLABEL: un entier n. lorsque CONTOUR est active, si n ; different de 0, choisit le type de label correspondant aux cas n ; pour les isolignes tracees par un trait. Pour specifier le type de ; label du contour en couleur, utiliser LABEL ; ; CONTMAX: lorsque CONTOUR est active, valeur maximum que l''on ; veut prendre en compte dans le trace des isolignes traces par un ; trait de couleur c_lab. Par defaut on prend le max (sur les pts mer) ; du tableau passe ds le mot cle CONTOUR. ; ; CONTMIN: lorsque CONTOUR est active, valeur minimum que l''on ; veut prendre en compte dans le trace des isolignes traces par un ; trait de couleur c_lab. Par defaut on prend le max (sur les pts mer) ; du tableau passe ds le mot cle CONTOUR. ; ; CONTNLEVEL: lorsque CONTOUR est active, nombre de contours ; trace par un trait de couleur c_lab a dessiner (actif si ; CONTLABEL=0) par defaut =20. ; ; CONTOUR: si on veut tracer les contours d''un champ different que celui ; que l''on dessin en couleur (par ex E-P en couleur et QSR en ; contours). Doit etre un champ reponadnt aux meme caracteristiques ; que l''argument numero 1 de pltt ; ; ENDPOINTS: mot clef specifiant que l'on veut faire une coupe ; verticale en diagonale. les coordonnees des extremites de ; celle-ci sont alors definies les 4 elements du vecteur ; ENDPOINTS: [x1,y1,x2,y2] qui sont les coordonnees ; ; /EXCHANGE_XY: permet d''intervertir les axes. ; ; FILTER: applique une moyenne glissante de largeur FILTER ; ; INTERVALLE: valeur d''un intervalle entre deux isolignes. Si ; aucun min n''est specifie, on choisit un contour min qui va bien ; avec l''intervalle specifie!. Si ce mot cle n''est pas specifie, on ; trace 20 isolignes du min au max. Rq: Qd CONTOUR est active ; INTERVALLE ne specifie que intervalle entre 2 isolignes coloriees en ; couleur. Pour specifier l''intervalle entre 2 isolignes traces par un trait ; de couleur c_lab utiliser CONTINTERVALLE. ; ; /INV: inverse le vecteur couleur utilise pour colorier le graphe ; (sans toucher au noir, au blanc et a la palette utilisee) ; ; LABEL: un entier n. si n different de 0, choisit le type de ; label correspondant aux cas n. cf label.pro ; Rq: Qd CONTOUR est active, ne specifie le type de label que pour les ; isolignes coloriees en couleur. Pour celles tracees par un trait de ; couleur c_lab utiliser CONTLABEL. ; ; /LANDSCAPE: oblige la feuille ou le fenetre a l''ecran a etre ; en position "allongee". ; ; LCT: entier designant le numero de la palette de couleur que ; l''on veut utiliser pour le plot. ; ; COL1d: --OBSOLETE--numero de la couleur qd on fait un trace 1d ; par defaut, 0. il faut mieux utiliser le mot cle COLOR utilise ; par plot ; ; MAXIN: permet de specifier la valeur maximum que l''on veut ; prendre en compte dans le trace des contours a l''aide d''un ; mot cle plutot que par l''argument max. Si l''argument et le ; mot cle sont specifies en meme temps, c''est la valeur ; specifiee par le mot cle qui est retenue. ; ; MININ: permet de specifier la valeur minimum que l''on veut ; prendre en compte dans le trace des contours a l''aide d''un ; mot cle plutot que par l''argument min. Si l''argument et le ; mot cle sont specifies en meme temps, c''est la valeur ; specifiee par le mot cle qui est retenue. ; ; NLEVEL: nombre de contours a dessiner. par defaut =20. actif si ; LABEL=0 ou n''est pas specifie. ; ; CONTNLEVEL: nombre de contours a dessiner qd on utilise ajoutcontour ; active par le mot cle CONTOUR.(actif si CONTLABEL=0) par defaut =20. ; ; /NOCOLORBAR: activer si on ne veut pas de colorbar ; ; /NOCONTOUR: activer si on ne veut pas de contour mais juste ; les couleurs ; ; /NOCOULEUR: activer si on veut juste les contours en noir et ; blanc sur fond blanc ; ; /NOERASE: activer pour faire un dessin a l''ecran sans creer ; une nouvelle fenetre. Rq: activer ds le cas d''un Postscript de ; plusieurs traces de type 't' pour ne pas faire un Postscript de ; plusieurs pages ; ; /OV1D:permet de surimprimer un courbe 1d a un precedent trace 1d. ; ; OVERPLOT: pour faire un pltt par dessus un autre. Rq: ; contrairemnet a l''utilisation de CONTOUR, ; l''utilisation de ce mot clef ne modifie pas la legende ou/et ; la barre de couleur. dans le cas d''un plot 1d, contrairement ; a ov1d, on peut changer les axes et les ranges. ; ; PETITDESSIN: vecteur de 3 ou 4 elements, applique pour faire un ; dessin sur une petite portion de feuille ou d''ecran. il delimite ; la zone ds laquelle va etre fait le dessin ; si il a 4 elements: ; il est alors constitute des coordonnees -exprime en cm reperes par ; rapport au coin en bas a gauche de la feuille ou de la fenetre ; (en portrait comme en landscape)- du coin en bas a ; gauche et du coin en haut a droite de la zone de dessin. ; si il a 3 elements: ; Ds ce cas, on divise la fenetre ou l''ecran en PETITDESSIN[0] ; colonnes, en PETITDESSIN[1] lignes le dessin se faisant ds la ; case numero PETITDESSIN[2].La numerotation commencant en haut ; a gauche par le numero 1 et suivant apres dans le sens de ; l''ecriture. ; Par defaut on fait un dessin occupant la plus grande place possible ; tout en concervant le rapport d''aspect (sauf qd REMPLI est active) ; ; /PORTRAIT: oblige la feuille ou la fenetre a etre en position "debout". ; ; /POST: faire une sortie postscript. Ne marche que si on fait ; un seul dessin sur la feuille. Si on fait plusieurs dessins, ; utiliser @ps ou plein2dessins ; ; REPEAT_C=n pour repeter une serie temporelle n fois ; ; /REMPLI:oblige le dessin a occuper l''espace maximum definit ; par petitdessin ; ; /REVERSE_X: pour inverser l''axe des x (et aussi le dessin) ; ; /REVERSE_Y: pour inverser l''axe des y (et aussi le dessin) ; ; /STRICTFILL: activer ce mot clef pour que le remplissage des ; contours ce fasse precisement entre le min et le max specifie ; en laissant en banc les valeurs inferieurs au min specifie et ; superieurs au max specifie. ; ; STYLE: style de tracer a adopter pour dessiner les isolignes par ; defaut style=0. cf style.pro ; ; STY1D: --OBSOLETE--numero du style utilise lors d''un trace ; 1d. Il faut mieux utiliser le mot cle LINESTYLE qui est celui ; de plot. Attention ce mot cle est encore utile si on veut ; faire des barres plutot qu''une courbe, mettre sty1d='bar' ; ; /TRANS: fait un postscript (active /post automatiquement) et l''imprime ; -si on le desire- sur un transparant ; ; TREND_TYPE: modify data by calling trends.pro ; ; TYPEIN: permet de specifier la valeur type de hovmoller que ; l''on veut faire: ; 'xt','yt','zt','t' ; a l''aide d''un mot cle plutot que par l''argument type Si ; l''argument et le mot cle sont specifies en meme temps, c''est ; la valeur specifiee par le mot cle qui est retenue. ; ; /USETRI: pour forcer a utiliser de triangulation. ; ; UNLABSUR: entier n. specifant qu''on ne labelle qu''un ; contour sur n. Par defaut unlabsur=2 ; ; /UNSUR2: si on veut tracer un countour sur deux. par defaut trace ; tous les contours ; ; WINDOW: nimero de la fenetre ou l''on veut faire le graphe (permet ; d'ouvrir plusieurs fenetres). par defaut on ouvre 'IDL0' ; ; YSURX: rapport d'echelle entre y et x. Par defaut=1 ; Par defaut on adapte pour occupe une grande partie de la feuille en sortie ; postScript ou pour cree une fenetre pas trop etiree ; ; COMMON BLOCKS: ; common.pro ; ; SIDE EFFECTS: ; ; RESTRICTIONS: ; ; EXAMPLE: ; ; MODIFICATION HISTORY: Sebastien Masson (smasson@lodyc.jussieu.fr) ; 27/5/98 ; Jerome Vialard (adapting plt to hovmoller drawing) ; 2/7/98 ; Sebastien Masson 14/8/98 (continents,barres) ; 15/1/98 ; adaptation pour les tableaux 3 et 4d pour que la moyenne soit faite ; dans pltt plutot que lors de la lecture. ; Sebastien Masson 14/8/98 ; 7/1999 ; Eric Guilyardi 29/7/99 FILTER, TREND_TYPE, ; REPEAT_C ; Sebastien Masson 08/02/2000 checkfield and ; usetri keyword. ;- ;------------------------------------------------------------ ;------------------------------------------------------------ ;------------------------------------------------------------ pro plttg,tab,gaxis,givenmin,givenmax,datmin,datmax,BOITE = boite, CONTOUR=contour $ ,ENDPOINTS=endpoints,INTERVALLE=intervalle,INV=inv $ ,CONTINTERVALLE=contintervalle,LABEL=label,CONTLABEL=contlabel $ ,STYLE=style, CONTMAX=contmax $ ,CONTMIN=contmin,NLEVEL=nlevel,CONTNLEVEL=contnlevel $ ,COL1D=col1d,STY1D=sty1d, MININ = minin, MAXIN = maxin $ ,OV1D=ov1d, FILTER = filter, TREND_TYPE = trend_type $ ,REPEAT_C = repeat_c, TYPEIN = typein, XT = XT, YT = YT, ZT = zt $ , TT = tt, STRICTFILL = strictfill, OVERPLOT = overplot $ , EXCHANGE_XY = exchange_xy $ , _extra = ex @common giventype = 'yt' ;------------------------------------------------------------ tempsun = systime(1) ; pour key_performance ;-------------------------------------------------------------- ; I2) reinitialisation. !p.,!x.,!y. ; Rq: on ne reinitialise pas qd on rapelle plt en boucle pour utiliser contour ;-------------------------------------------------------------- if n_elements(contour) ne 4 AND NOT keyword_set(overplot) $ AND NOT keyword_set(ov1d) then reinitplt ;-------------------------------------------------------------- ; I1) lecture du champ ;-------------------------------------------------------------- if keyword_set(boite) then oldboite = [lon1, lon2, lat1, lat2, prof1, prof2] if n_elements(giventype) NE 0 then type = giventype if n_elements(givenmin) NE 0 then min = givenmin if n_elements(givenmax) NE 0 then max = givenmax if n_elements(minin) NE 0 then min = minin if n_elements(maxin) NE 0 then max = maxin if keyword_set(typein) then BEGIN if size(type, /type) NE 7 AND size(type, /type) NE 0 then begin if n_elements(min) NE 0 then max = min min = type endif type = typein ENDIF z2d = tab mask = 1 ;--------------------------------------------------------------- ; selection du type de graphique. ;--------------------------------------------------------------- ;--------------------------------------------------------------- ; repetition de la serie temporelle ;--------------------------------------------------------------- IF NOT keyword_set(repeat_c) THEN repeat_c = 1 temps = time[0:jpt-1] IF repeat_c GT 1 THEN BEGIN taille=size(z2d) CASE taille[0] OF 1: z2d = reform(z2d#replicate(1, repeat_c), taille[1]*repeat_c) 2: BEGIN z2d = z2d[*]#replicate(1, repeat_c) z2d = reform(z2d, taille[1], taille[2]*repeat_c, /over) END ELSE: ENDCASE temps = [temps, (lindgen(jpt*(REPEAT_c-1))+1)*(temps[1]-temps[0])+temps[jpt-1]] ENDIF ;---------------------------------------------------------------------------- ; determination du mi:min et du ma:max de z2d ainsi que de max: max et ; min: min pour le dessin. ;----------------------------------------------------------------------------- ; faudra-t-il faire un autoscale ??? autoscale = testvar(var = min) EQ testvar(var = max) AND NOT keyword_set(intervalle) determineminmax, z2d, mask, mi, ma, MININ = min, MAXIN = max, nan = nan, INTERVALLE = intervalle if z2d[0] EQ -1 THEN return ; on fait un autoscale si besoin if autoscale then autoscale, min, max, intervalle ;----------------------------------------------------------------------------- ;----------------------------------------------------------------------------- if n_elements(contour) ne 4 AND NOT keyword_set(overplot) THEN $ placedessin, 'pltt',posfenetre, posbar, contour = contour, direc = direc, type = type, endpoints = endpoints, _extra = ex ;-------------------------------------------------------------- ;-------------------------------------------------------------- ; 2eme partie: dessin ;-------------------------------------------------------------- ;----------------------------------------------------------- ; definition des axes ;---------------------------------------------------------- ;----------------------------------------------------------------------------- ; definition des vecteurs abscisse et ordonee ; la triangulation est definie pour que le trace soit effectue du bas ; a gauche vers le haut a droite. il faut donc la matrice e contourer ; se presente de cette maniere, d''ou certains transpose et reverse ;----------------------------------------------------------------------------- ;----------------------------------------------------------------------------- ; definition des bornes de l''axe temporel ;----------------------------------------------------------------------------- case N_PARAMS() OF 5 : begin tempsmin = juldate(datmin, _extra = ex) tempsmax = temps[(jpt*repeat_c)-1] end 6 : begin tempsmin = juldate(datmin, _extra = ex) tempsmax = juldate(datmax, _extra = ex) end else : begin tempsmin = temps[0] tempsmax = temps[(jpt*repeat_c)-1] end endcase ;----------------------------------------------------------------------------- ; on shift l''axe du temps pour des questions de precision sur les ; dates du calendier julien en long qui sont passes en float ds les axes yy = gaxis xx = temps-tempsmin ;-------------------------------------------------------------- if NOT keyword_set(overplot) THEN axe, type, tempsmin, tempsmax, plttg = 1, _EXTRA = ex ELSE BEGIN !x.range=!x.range-tempsmin !x.tickv=!x.tickv-tempsmin ENDELSE ;------------------------------------------------------------ ;------------------------------------------------------------ ; dessin ;------------------------------------------------------------ ; 2d ;------------------------------------------------------------ ;-------------------------------------------------------------- ; choix des labels ;----------------------------------------------------------- if keyword_set(intervalle) AND NOT keyword_set(label) then label=1 if keyword_set(label) eq 0 then cas=0 else cas=label label,cas,min,max,ncontour,level_z2d,NLEVEL=nlevel,INTERVALLE=intervalle, strictfill = strictfill ;-------------------------------------------------------------- ; choix de style ;----------------------------------------------------------- if not keyword_set(style) then style=0 style,style,level_z2d,linestyle,thick if keyword_set(inv) then couleur=reverse(couleur) ;---------------------------------------------------------------------- nby = n_elements(yy) nbx = n_elements(xx) xx = xx#replicate(1, nby) ; on passe les axes en tableaux 2d yy = replicate(1, nbx)#yy triangulation = -1 ;---------------------------------------------------------------------- pltbase,z2d, xx, yy, mask,xx, yy, level_z2d, couleur, contour = contour,/noerase $ , c_linestyle=linestyle,c_labels=1-(indgen(n_elements(level_z2d)) MOD 2) $ , trichamp = triangulation, trimsk = triangulation, overplot = overplot $ , c_thick=thick, performance = key_performance, usetri = keyword_set(nan) $ , coinmontemask=coinmontemask, coindescendmask=coindescendmask, _extra = ex ;------------------------------------------------------------ if n_elements(contour) eq 4 then BEGIN ; c''est la 2eme fois que je passe ds pltt contour = {mietma:[mi, ma], unit:varunit, inter:intervalle} ; je renvoie le min, le max et l''unite return endif ;------------------------------------------------------------ if keyword_set(contour) then BEGIN pourlegende = [1, 1, 1, 1] oldattributs = saveatt() oldcouleur = couleur plttg,contour,gaxis, contmin,contmax,CONTOUR=pourlegende, /noerase, USETRI = usetri $ ,INTERVALLE=contintervalle,LABEL=contlabel,STYLE=style, ENDPOINTS = endpoints $ ,NLEVEL=contnlevel,YSURX=ysurx, BOITE = boite, STRICTFILL = strictfill, _extra = ex couleur = oldcouleur restoreatt, oldattributs endif ;---------------------------------------------------------------------- ;---------------------------------------------------------------------- if keyword_set(overplot) then GOTO, fini ;------------------------------------------------------------ ; legendes + affichage de celles-ci ;------------------------------------------------------------ legende,mi,ma,type, CONTOUR = pourlegende, DIREC = direc, INTERVALLE = intervalle $ , plttg = 1, _extra = ex plot,[0],[0],/noerase,/nodata,color=c_cote, xstyle = 1, ystyle = 1 ;------------------------------------------------------------ ; barre de couleur ;------------------------------------------------------------ couleur = couleur[0:ncontour-1-keyword_set(strictfill)] barrecouleur, position=posbar,divisions=(ncontour-keyword_set(strictfill))/2,min=min $ , max=max,discret=couleur,_extra = ex ;------------------------------------------------------------ fini: ;------------------------------------------------------------ ; on remet l''axe du temps en jours julien IDL et non pas en jours ; juliens comptes a partir tempsmin ;------------------------------------------------------------ !x.range=!x.range+tempsmin !x.tickv=!x.tickv+tempsmin ; on fait un faut plot pour que ces valeurs soient prises en ; consideration plot,[0], [0], /noerase,xstyle=5, ystyle = 5, title = '', subtitle = '', ytitle = '', xtitle = '' ;------------------------------------------------------------ ;------------------------------------------------------------ terminedessin, _extra = ex if keyword_set(oldboite) then domdef, oldboite,GRILLE=[vargrid, 'T'] ;------------------------------------------------------------ if n_elements(key_performance) NE 0 then $ IF key_performance EQ 1 THEN print, 'temps pltt', systime(1)-tempsun ;------------------------------------------------------------ ;------------------------------------------------------------ ;------------------------------------------------------------ return end