Ticket #15: plttg.pro

File plttg.pro, 21.4 KB (added by anonymous, 18 years ago)
Line 
1;------------------------------------------------------------
2;+
3; NAME:
4;       PLTTG
5;
6; PURPOSE:
7;       trace des graphes hovmoller avec axe generalise
8;
9; CATEGORY:
10;       Graphics, trace des graphes hovmoller: gt
11;
12; CALLING SEQUENCE:
13;       plttg, champ,gaxis [,min[, max[, datmin[, datmax]]]]
14;
15; INPUTS:
16;       champ: le champ dont on veut faire le hovmoller champ
17;       peut etre de 2 types:
18;       1) un tableu qui peut etre:
19;          * 3d ou 4d: la derniere composante etant le temps. dans ce
20;            cas, le tableau va passer dans grossemoyenne pour etre
21;            moyennee suivant et devenir un tableau 2d ou 1d.
22;          * 2d: si tableau est deja 2d, il n''est pas modifie
23;            (attention les terres doivent etre masquees a la valeure
24;            valmask) et type doit qd meme etre specifie pour qu''on
25;            sache de quel trace il sagit. Pour avoir une legende
26;            correcte, respecifier la zone d''extraction via BOITE
27;          * 1d: uniquement pour les traces de type 't'. Type doit qd
28;            meme etre specifie pour qu''on sache de quel trace il
29;            sagit. Pour avoir une legende correcte, respecifier la zone
30;            d''extraction via BOITE
31;       2) une structure repondant aux critaire specifies par
32;       litchamp.pro. cf. IDL> xhelp,'litchamp'. Le tableau contennu ds
33;       la structure repondant aux criteres du cas 1) cf. ci-dessus
34;
35;       TYPE: type de hovmoller que l''on veut faire:
36;             'yt' only 
37;
38; ces arguments ne sont pas obligatoires:
39
40;       MAX: valeur maximum que l''on veut prendre en compte dans le trace
41; des contours. Par defaut on prend le max de tableau (sur les pts mer)
42;
43;       MIN: valeur minimum que l''on veut prendre en compte dans le trace
44; des contours. Par defaut on prend le min de tableau (sur les pts
45; mer)
46;
47;       DATMIN: c''est la borne inf de l''axe temporel. c''est un
48;       longinteger de la forme yyyymmdd (ou bien yymmdd).
49;
50;       DATMAX: c''est la borne max de l''axe temporel. c''est un
51;       longinteger de la forme yyyymmdd (ou bien yymmdd)
52;
53; KEYWORD PARAMETERS:
54;
55;       BOITE:vecteur indiquant la zone geographique (3d) sur laquelle doit
56; etre fait l''extraction du champ pour faire le hovmoeller.
57; Si BOITE a :
58; 1 element : l''extraction est faite sur [lon1, lon2, lat1, lat2, 0.,boite[0]]
59; 2 elements: l''extraction est faite sur [lon1, lon2, lat1, lat2, boite[0],boite[1]]
60; 4 elements: l''extraction est faite sur [Boite, prof1, prof2]
61; 5 elements: l''extraction est faite sur [Boite[0:3], 0, Boite[4]]
62; 6 elements: l''extraction est faite sur Boite
63;
64; Ou lon1, lon2,lat1,lat2,prof1,prof2 sont les variables globales
65; definies lors du dernier domdef!
66;
67;      CB_TITLE: le titre de la colorbar
68;
69;      CB_SUBTITLE: le soustitre de la colorbar
70;
71;      CB_CHARSIZE: The character size of the color bar annotations
72;
73;       CONTINTERVALLE: lorsque CONTOUR est active, valeur d''un
74; intervalle entre deux isolignes traces par un trait ds la couleur
75; c_lab. Il peut ainsi etre different de celui specifie par INTERVALLE
76; qui, cas ce cas, ne controle que les isolignes coloriees en
77; couleurs. Si aucun min n''est specifie, on choisit un contour min qui va
78; bien avec l''intervalle specifie!. Si ce mot cle n''est pas
79; specifie, on trace 20 isolignes du min au max.
80;
81;       CONTLABEL: un entier n. lorsque CONTOUR est active, si n
82; different de 0, choisit le type de label correspondant aux cas n
83; pour les isolignes tracees par un trait. Pour specifier le type de
84; label du contour en couleur, utiliser LABEL
85;
86;       CONTMAX: lorsque CONTOUR est active, valeur maximum que l''on
87; veut prendre en compte dans le trace des isolignes traces par un
88; trait de couleur c_lab. Par defaut on prend le max (sur les pts mer)
89; du tableau passe ds le mot cle CONTOUR.
90;
91;       CONTMIN: lorsque CONTOUR est active, valeur minimum que l''on
92; veut prendre en compte dans le trace des isolignes traces par un
93; trait de couleur c_lab. Par defaut on prend le max (sur les pts mer)
94; du tableau passe ds le mot cle CONTOUR.
95;
96;       CONTNLEVEL: lorsque CONTOUR est active, nombre de contours
97; trace par un trait de couleur c_lab a dessiner (actif si
98; CONTLABEL=0) par defaut =20.
99;
100;       CONTOUR: si on veut tracer les contours d''un champ different que celui
101; que l''on dessin en couleur (par ex E-P en couleur et QSR en
102; contours). Doit etre un champ reponadnt aux meme caracteristiques
103; que l''argument numero 1 de pltt
104;
105;       ENDPOINTS: mot clef specifiant que l'on veut faire une coupe
106;       verticale en diagonale. les coordonnees des extremites de
107;       celle-ci sont alors definies les 4 elements du vecteur
108;       ENDPOINTS: [x1,y1,x2,y2] qui sont les coordonnees
109;
110;       /EXCHANGE_XY: permet d''intervertir les axes.
111;
112;       FILTER: applique une moyenne glissante de largeur FILTER
113;
114;       INTERVALLE: valeur d''un intervalle entre deux isolignes. Si
115; aucun min n''est specifie, on choisit un contour min qui va bien
116; avec l''intervalle specifie!. Si ce mot cle n''est pas specifie, on
117; trace 20 isolignes du min au max. Rq: Qd CONTOUR est active
118; INTERVALLE ne specifie que intervalle entre 2 isolignes coloriees en
119; couleur. Pour specifier l''intervalle entre 2 isolignes traces par un trait
120; de couleur c_lab utiliser CONTINTERVALLE.
121;
122;       /INV: inverse le vecteur couleur utilise pour colorier le graphe
123;             (sans toucher au noir, au blanc et a la palette utilisee)
124;
125;       LABEL: un entier n. si n different de 0, choisit le type de
126; label correspondant aux cas n. cf label.pro
127; Rq: Qd CONTOUR est active, ne specifie le type de label que pour les
128; isolignes coloriees en couleur. Pour celles tracees par un trait de
129; couleur c_lab utiliser CONTLABEL.
130;
131;       /LANDSCAPE: oblige la feuille ou le fenetre a l''ecran a etre
132;       en position "allongee".
133;       
134;       LCT: entier designant le numero de la palette de couleur que
135;       l''on veut utiliser pour le plot.
136;       
137;       COL1d: --OBSOLETE--numero de la couleur qd on fait un trace 1d
138;       par defaut, 0. il faut mieux utiliser le mot cle COLOR utilise
139;       par plot
140;
141;       MAXIN: permet de specifier la valeur maximum que l''on veut
142;       prendre en compte dans le trace des contours a l''aide d''un
143;       mot cle plutot que par l''argument max. Si l''argument et le
144;       mot cle sont specifies en meme temps, c''est la valeur
145;       specifiee par le mot cle qui est retenue.
146;
147;       MININ: permet de specifier la valeur minimum que l''on veut
148;       prendre en compte dans le trace des contours a l''aide d''un
149;       mot cle plutot que par l''argument min. Si l''argument et le
150;       mot cle sont specifies en meme temps, c''est la valeur
151;       specifiee par le mot cle qui est retenue.
152;
153;       NLEVEL: nombre de contours a dessiner. par defaut =20. actif si
154; LABEL=0 ou n''est pas specifie.
155;
156;       CONTNLEVEL: nombre de contours a dessiner qd on utilise ajoutcontour
157; active par le mot cle CONTOUR.(actif si CONTLABEL=0) par defaut =20.
158;
159;       /NOCOLORBAR: activer si on ne veut pas de colorbar
160;
161;       /NOCONTOUR: activer si on ne veut pas de contour mais juste
162;       les couleurs
163;
164;       /NOCOULEUR: activer si on veut juste les contours en noir et
165;       blanc sur fond blanc
166;
167;       /NOERASE: activer pour faire un dessin a l''ecran sans creer
168; une nouvelle fenetre. Rq: activer ds le cas d''un Postscript de
169; plusieurs traces de type 't' pour ne pas faire un Postscript de
170; plusieurs pages
171;
172;       /OV1D:permet de surimprimer un courbe 1d a un precedent trace 1d.
173;
174;       OVERPLOT: pour faire un pltt par dessus un autre. Rq:
175;       contrairemnet a l''utilisation de CONTOUR,
176;       l''utilisation de ce mot clef ne modifie pas la legende ou/et
177;       la barre de couleur. dans le cas d''un plot 1d, contrairement
178;       a ov1d, on peut changer les axes et les ranges.
179;
180;       PETITDESSIN: vecteur de 3 ou 4 elements, applique pour faire un
181; dessin sur une petite portion de feuille ou d''ecran. il delimite
182; la zone ds laquelle va etre fait le dessin
183; si il a 4 elements:
184;       il est alors constitute des coordonnees -exprime en cm reperes par
185;       rapport au coin en bas a gauche de la feuille ou de la fenetre
186;       (en portrait comme en landscape)- du coin en bas a
187;       gauche et du coin en haut a droite  de la zone de dessin.
188; si il a 3 elements:
189;       Ds ce cas, on divise la fenetre ou l''ecran en PETITDESSIN[0]
190;       colonnes, en PETITDESSIN[1] lignes le dessin se faisant ds la
191;       case numero PETITDESSIN[2].La numerotation commencant en haut
192;       a gauche par le numero 1 et suivant apres dans le sens de
193;       l''ecriture.
194; Par defaut on fait un dessin occupant la plus grande place possible
195; tout en concervant le rapport d''aspect (sauf qd REMPLI est active)
196;
197;       /PORTRAIT: oblige la feuille ou la fenetre a etre en position "debout".
198;
199;       /POST: faire une sortie postscript. Ne marche que si on fait
200;       un seul dessin sur la feuille. Si on fait plusieurs dessins,
201;       utiliser @ps ou plein2dessins
202;
203;       REPEAT_C=n pour repeter une serie temporelle n fois
204;
205;       /REMPLI:oblige le dessin a occuper l''espace maximum definit
206;       par petitdessin
207;
208;       /REVERSE_X: pour inverser l''axe des x (et aussi le dessin)
209;
210;       /REVERSE_Y: pour inverser l''axe des y (et aussi le dessin)
211;
212;       /STRICTFILL: activer ce mot clef pour que le remplissage des
213;       contours ce fasse precisement entre le min et le max specifie
214;       en laissant en banc les valeurs inferieurs au min specifie et
215;       superieurs au max specifie.
216;
217;       STYLE: style de tracer a adopter pour dessiner les isolignes par
218; defaut style=0. cf style.pro
219;
220;       STY1D: --OBSOLETE--numero du style utilise lors d''un trace
221;       1d. Il faut mieux utiliser le mot cle LINESTYLE qui est celui
222;       de plot. Attention ce mot cle est encore utile si on veut
223;       faire des barres plutot qu''une courbe, mettre sty1d='bar'
224;
225;       /TRANS: fait un postscript (active /post automatiquement) et l''imprime
226; -si on le desire- sur un transparant
227;
228;        TREND_TYPE: modify data by calling trends.pro
229;
230;        TYPEIN: permet de specifier la valeur type de hovmoller que
231;        l''on veut faire:
232;             'xt','yt','zt','t' 
233;       a l''aide d''un mot cle plutot que par l''argument type Si
234;       l''argument et le mot cle sont specifies en meme temps, c''est
235;       la valeur specifiee par le mot cle qui est retenue.
236;
237;       /USETRI: pour forcer a utiliser de triangulation.
238;
239;        UNLABSUR: entier n. specifant qu''on ne labelle qu''un
240;        contour sur n. Par defaut unlabsur=2
241;
242;       /UNSUR2: si on veut tracer un countour sur deux. par  defaut trace
243; tous les contours
244;
245;       WINDOW: nimero de la fenetre ou l''on veut faire le graphe (permet
246; d'ouvrir plusieurs fenetres). par defaut on ouvre 'IDL0'
247;
248;       YSURX: rapport d'echelle entre y et x. Par defaut=1
249; Par defaut on adapte pour occupe une grande partie de la feuille en sortie
250; postScript ou pour cree une fenetre pas trop etiree
251;
252; COMMON BLOCKS:
253;       common.pro
254;
255; SIDE EFFECTS:
256;
257; RESTRICTIONS:
258;
259; EXAMPLE:
260;
261; MODIFICATION HISTORY: Sebastien Masson (smasson@lodyc.jussieu.fr)
262;                       27/5/98
263;                       Jerome Vialard (adapting plt to hovmoller drawing)
264;                       2/7/98
265;                       Sebastien Masson 14/8/98 (continents,barres)
266;                       15/1/98
267; adaptation pour les tableaux 3 et 4d pour que la moyenne soit faite
268; dans pltt plutot que lors de la lecture.
269;                       Sebastien Masson 14/8/98
270;                       7/1999
271;                       Eric Guilyardi 29/7/99 FILTER, TREND_TYPE,
272;                       REPEAT_C
273;                       Sebastien Masson 08/02/2000 checkfield and
274;                       usetri keyword.
275;-
276;------------------------------------------------------------
277;------------------------------------------------------------
278;------------------------------------------------------------
279pro plttg,tab,gaxis,givenmin,givenmax,datmin,datmax,BOITE = boite, CONTOUR=contour $
280         ,ENDPOINTS=endpoints,INTERVALLE=intervalle,INV=inv  $
281         ,CONTINTERVALLE=contintervalle,LABEL=label,CONTLABEL=contlabel $
282         ,STYLE=style, CONTMAX=contmax $
283         ,CONTMIN=contmin,NLEVEL=nlevel,CONTNLEVEL=contnlevel $
284         ,COL1D=col1d,STY1D=sty1d, MININ = minin, MAXIN = maxin $
285         ,OV1D=ov1d, FILTER = filter, TREND_TYPE = trend_type $
286         ,REPEAT_C = repeat_c, TYPEIN = typein, XT = XT, YT = YT, ZT = zt $
287         , TT = tt, STRICTFILL = strictfill, OVERPLOT = overplot $
288         , EXCHANGE_XY = exchange_xy $
289         , _extra = ex
290@common
291
292   giventype = 'yt'
293;------------------------------------------------------------
294   tempsun = systime(1)         ; pour key_performance
295;--------------------------------------------------------------
296; I2) reinitialisation. !p.,!x.,!y.
297; Rq: on ne reinitialise pas qd on rapelle plt en boucle pour utiliser contour
298;--------------------------------------------------------------
299   if n_elements(contour) ne 4 AND NOT keyword_set(overplot) $
300    AND NOT keyword_set(ov1d) then reinitplt
301;--------------------------------------------------------------
302; I1) lecture du champ
303;--------------------------------------------------------------
304   if keyword_set(boite) then oldboite = [lon1, lon2, lat1, lat2, prof1, prof2]
305   if n_elements(giventype) NE 0 then type = giventype
306   if n_elements(givenmin) NE 0 then min = givenmin
307   if n_elements(givenmax) NE 0 then max = givenmax
308   if n_elements(minin) NE 0 then min = minin
309   if n_elements(maxin) NE 0 then max = maxin
310   if keyword_set(typein) then BEGIN
311      if size(type, /type) NE 7 AND size(type, /type) NE 0 then begin
312         if n_elements(min) NE 0 then max = min
313         min = type
314      endif
315      type = typein
316   ENDIF
317
318   z2d = tab
319   mask = 1
320
321;---------------------------------------------------------------
322; selection du type de graphique.
323;---------------------------------------------------------------
324;---------------------------------------------------------------
325; repetition de la serie temporelle
326;---------------------------------------------------------------
327
328   IF NOT keyword_set(repeat_c) THEN repeat_c = 1
329
330   temps = time[0:jpt-1]
331   IF repeat_c GT 1 THEN BEGIN
332      taille=size(z2d)
333      CASE taille[0] OF
334         1: z2d = reform(z2d#replicate(1, repeat_c), taille[1]*repeat_c)
335         2: BEGIN
336            z2d = z2d[*]#replicate(1, repeat_c)
337            z2d = reform(z2d, taille[1], taille[2]*repeat_c, /over)
338         END
339         ELSE:
340      ENDCASE
341      temps = [temps, (lindgen(jpt*(REPEAT_c-1))+1)*(temps[1]-temps[0])+temps[jpt-1]]
342   ENDIF
343
344;----------------------------------------------------------------------------
345;   determination du mi:min et du ma:max de z2d ainsi que de max: max et
346;    min: min pour le dessin.
347;-----------------------------------------------------------------------------
348; faudra-t-il faire un autoscale ???
349   autoscale = testvar(var = min) EQ testvar(var = max) AND NOT keyword_set(intervalle)
350   determineminmax, z2d, mask, mi, ma, MININ = min, MAXIN = max, nan = nan, INTERVALLE = intervalle
351   if z2d[0] EQ -1 THEN return
352; on fait un autoscale si besoin
353   if autoscale then autoscale, min, max, intervalle
354;-----------------------------------------------------------------------------
355;-----------------------------------------------------------------------------
356   if n_elements(contour) ne 4  AND NOT keyword_set(overplot) THEN $
357    placedessin, 'pltt',posfenetre, posbar, contour = contour, direc = direc, type = type, endpoints = endpoints, _extra = ex
358;--------------------------------------------------------------
359;--------------------------------------------------------------
360; 2eme partie: dessin
361;--------------------------------------------------------------
362;-----------------------------------------------------------
363;   definition des axes
364;----------------------------------------------------------
365;-----------------------------------------------------------------------------
366; definition des vecteurs abscisse et ordonee
367; la triangulation est definie pour que le trace soit effectue du bas
368; a gauche vers le haut a droite. il faut donc la matrice e contourer
369; se presente de cette maniere, d''ou certains transpose et reverse
370;-----------------------------------------------------------------------------
371;-----------------------------------------------------------------------------
372; definition des bornes de l''axe temporel
373;-----------------------------------------------------------------------------
374   case N_PARAMS() OF
375      5 : begin
376         tempsmin = juldate(datmin, _extra = ex)
377         tempsmax = temps[(jpt*repeat_c)-1]
378      end
379      6 : begin
380         tempsmin = juldate(datmin, _extra = ex)
381         tempsmax = juldate(datmax, _extra = ex)
382      end
383      else : begin
384         tempsmin = temps[0]
385         tempsmax = temps[(jpt*repeat_c)-1]
386      end
387   endcase
388;-----------------------------------------------------------------------------
389; on shift l''axe du temps pour des questions de precision sur les
390; dates du calendier julien en long qui sont passes en float ds les axes
391   yy = gaxis
392   xx = temps-tempsmin
393;--------------------------------------------------------------
394   if NOT keyword_set(overplot) THEN axe, type, tempsmin, tempsmax, plttg = 1, _EXTRA = ex ELSE BEGIN
395      !x.range=!x.range-tempsmin
396      !x.tickv=!x.tickv-tempsmin
397   ENDELSE
398;------------------------------------------------------------
399;------------------------------------------------------------
400; dessin
401;------------------------------------------------------------
402; 2d
403;------------------------------------------------------------
404;--------------------------------------------------------------
405; choix des labels
406;-----------------------------------------------------------
407   if keyword_set(intervalle) AND NOT keyword_set(label) then label=1
408   if keyword_set(label) eq 0 then cas=0 else cas=label
409   label,cas,min,max,ncontour,level_z2d,NLEVEL=nlevel,INTERVALLE=intervalle, strictfill = strictfill
410;--------------------------------------------------------------
411; choix de style
412;-----------------------------------------------------------
413   if not keyword_set(style) then style=0
414   style,style,level_z2d,linestyle,thick
415   if keyword_set(inv) then couleur=reverse(couleur)
416;----------------------------------------------------------------------
417   nby = n_elements(yy)
418   nbx = n_elements(xx)
419   xx = xx#replicate(1, nby)    ; on passe les axes en tableaux 2d
420   yy = replicate(1, nbx)#yy
421   
422   triangulation = -1
423;----------------------------------------------------------------------
424   pltbase,z2d, xx, yy, mask,xx, yy, level_z2d, couleur, contour = contour,/noerase $
425    , c_linestyle=linestyle,c_labels=1-(indgen(n_elements(level_z2d)) MOD 2) $
426    , trichamp = triangulation, trimsk = triangulation, overplot = overplot $
427    , c_thick=thick, performance = key_performance, usetri = keyword_set(nan) $
428    , coinmontemask=coinmontemask, coindescendmask=coindescendmask, _extra = ex
429;------------------------------------------------------------
430   if n_elements(contour) eq 4 then BEGIN ; c''est la 2eme fois que je passe ds pltt
431      contour = {mietma:[mi, ma], unit:varunit, inter:intervalle} ; je renvoie le min, le max et l''unite
432      return
433   endif
434;------------------------------------------------------------
435   if keyword_set(contour) then BEGIN
436      pourlegende = [1, 1, 1, 1]
437      oldattributs = saveatt()
438      oldcouleur = couleur
439      plttg,contour,gaxis, contmin,contmax,CONTOUR=pourlegende, /noerase, USETRI = usetri $
440       ,INTERVALLE=contintervalle,LABEL=contlabel,STYLE=style, ENDPOINTS = endpoints $
441       ,NLEVEL=contnlevel,YSURX=ysurx, BOITE = boite, STRICTFILL = strictfill, _extra = ex
442      couleur = oldcouleur
443      restoreatt, oldattributs
444   endif
445;----------------------------------------------------------------------
446;----------------------------------------------------------------------
447   if keyword_set(overplot) then GOTO, fini
448;------------------------------------------------------------
449; legendes + affichage de celles-ci
450;------------------------------------------------------------
451   legende,mi,ma,type, CONTOUR = pourlegende, DIREC = direc, INTERVALLE =  intervalle $
452    , plttg = 1, _extra = ex
453   plot,[0],[0],/noerase,/nodata,color=c_cote, xstyle = 1, ystyle = 1
454
455;------------------------------------------------------------
456; barre de couleur
457;------------------------------------------------------------
458   couleur = couleur[0:ncontour-1-keyword_set(strictfill)]
459   barrecouleur, position=posbar,divisions=(ncontour-keyword_set(strictfill))/2,min=min $
460    , max=max,discret=couleur,_extra = ex
461;------------------------------------------------------------
462fini:
463;------------------------------------------------------------
464; on remet l''axe du temps en jours julien IDL et non pas en jours
465; juliens comptes a partir tempsmin
466;------------------------------------------------------------
467   !x.range=!x.range+tempsmin
468   !x.tickv=!x.tickv+tempsmin
469; on fait un faut plot pour que ces valeurs soient prises en
470; consideration
471   plot,[0], [0], /noerase,xstyle=5, ystyle = 5, title = '', subtitle = '', ytitle = '', xtitle = ''
472;------------------------------------------------------------
473;------------------------------------------------------------
474   terminedessin, _extra = ex
475   if keyword_set(oldboite) then domdef, oldboite,GRILLE=[vargrid, 'T']
476;------------------------------------------------------------
477   if n_elements(key_performance) NE 0 then $
478    IF key_performance EQ 1 THEN print, 'temps pltt', systime(1)-tempsun
479;------------------------------------------------------------
480;------------------------------------------------------------
481;------------------------------------------------------------
482   return
483end
484
485