source: trunk/procs/saxo_mods/plttg.pro

Last change on this file was 206, checked in by pinsard, 14 years ago

homegenize ELSE BEGIN ... ENDELSE

  • Property svn:keywords set to Id
File size: 19.8 KB
Line 
1;+
2;
3; trace des graphes hovmoller avec axe generalise
4;
5; @categories
6; Graphics, trace des graphes hovmoller: gt
7;
8; @param TAB {in}{required}{type=array or struct}
9; le champ dont on veut faire le hovmoller champ
10;       peut etre de 2 types:
11;       1) un tableau qui peut etre:
12;          * 3d ou 4d: la derniere composante etant le temps. dans ce
13;            cas, le tableau va passer dans grossemoyenne pour etre
14;            moyenné suivant et devenir un tableau 2d ou 1d.
15;          * 2d: si tableau est deja 2d, il n''est pas modifie
16;            (attention les terres doivent etre masquees a la valeure
17;            valmask) et type doit qd meme etre specifie pour qu''on
18;            sache de quel trace il sagit. Pour avoir une legende
19;            correcte, respecifier la zone d''extraction via BOITE
20;          * 1d: uniquement pour les traces de type 't'. Type doit qd
21;            meme etre specifie pour qu''on sache de quel trace il
22;            sagit. Pour avoir une legende correcte, respecifier la zone
23;            d''extraction via BOITE
24;       2) une structure repondant aux critères specifies par
25;       <pro>litchamp</pro>.
26;       cf. IDL> xhelp,'litchamp'. Le tableau contennu ds
27;       la structure repondant aux criteres du cas 1) cf. ci-dessus
28;
29; @param GAXIS {in}
30;
31; @param GIVENMAX {in}{optional}
32; valeur maximum que l''on veut prendre en compte dans le trace
33; des contours. Par defaut on prend le max de tableau (sur les pts mer)
34;
35; @param GIVENMIN {in}{optional}
36; valeur minimum que l''on veut prendre en compte dans le trace
37; des contours. Par defaut on prend le min de tableau (sur les pts
38; mer)
39;
40; @param DATMIN {in}{optional}
41; c''est la borne inf de l''axe temporel. c''est un
42;       longinteger de la forme yyyymmdd (ou bien yymmdd).
43;
44; @param DATMAX {in}{optional}
45; c''est la borne max de l''axe temporel. c''est un
46;       longinteger de la forme yyyymmdd (ou bien yymmdd)
47;
48; @keyword BOITE
49; vecteur indiquant la zone geographique (3d) sur laquelle doit
50; etre fait l''extraction du champ pour faire le hovmoeller.
51; Si BOITE a :
52; 1 element : l''extraction est faite sur [lon1, lon2, lat1, lat2, 0.,boite[0]]
53; 2 elements: l''extraction est faite sur [lon1, lon2, lat1, lat2, boite[0],boite[1]]
54; 4 elements: l''extraction est faite sur [Boite, prof1, prof2]
55; 5 elements: l''extraction est faite sur [Boite[0:3], 0, Boite[4]]
56; 6 elements: l''extraction est faite sur Boite
57;
58; Ou lon1, lon2,lat1,lat2,prof1,prof2 sont les variables globales
59; definies lors du dernier domdef!
60;
61; @keyword CONTINTERVALLE
62; lorsque CONTOUR est active, valeur d''un
63; intervalle entre deux isolignes traces par un trait ds la couleur
64; c_lab. Il peut ainsi etre different de celui specifie par INTERVALLE
65; qui, cas ce cas, ne controle que les isolignes coloriees en
66; couleurs. Si aucun min n''est specifie, on choisit un contour min qui va
67; bien avec l''intervalle specifie!. Si ce mot cle n''est pas
68; specifie, on trace 20 isolignes du min au max.
69;
70; @keyword CONTLABEL
71; un entier n. lorsque CONTOUR est active, si n
72; different de 0, choisit le type de label correspondant aux cas n
73; pour les isolignes tracees par un trait. Pour specifier le type de
74; label du contour en couleur, utiliser LABEL
75;
76; @keyword CONTMAX
77; lorsque CONTOUR est active, valeur maximum que l''on
78; veut prendre en compte dans le trace des isolignes traces par un
79; trait de couleur c_lab. Par defaut on prend le max (sur les pts mer)
80; du tableau passe ds le mot cle CONTOUR.
81;
82; @keyword CONTMIN
83; lorsque CONTOUR est active, valeur minimum que l''on
84; veut prendre en compte dans le trace des isolignes traces par un
85; trait de couleur c_lab. Par defaut on prend le max (sur les pts mer)
86; du tableau passe ds le mot cle CONTOUR.
87;
88; @keyword CONTNLEVEL
89; lorsque CONTOUR est active, nombre de contours
90; trace par un trait de couleur c_lab a dessiner (actif si
91; CONTLABEL=0) par defaut =20.
92;
93; @keyword CONTOUR
94; si on veut tracer les contours d''un champ different que celui
95; que l''on dessin en couleur (par ex E-P en couleur et QSR en
96; contours). Doit etre un champ reponadnt aux meme caracteristiques
97; que l''argument numero 1 de pltt
98;
99; @keyword ENDPOINTS
100; mot clef specifiant que l'on veut faire une coupe
101;       verticale en diagonale. les coordonnees des extremites de
102;       celle-ci sont alors definies les 4 elements du vecteur
103;       ENDPOINTS: [x1,y1,x2,y2] qui sont les coordonnees
104;
105; @keyword EXCHANGE_XY
106; permet d''intervertir les axes.
107;
108; @keyword FILTER
109; applique une moyenne glissante de largeur FILTER
110;
111; @keyword INTERVALLE
112; valeur d''un intervalle entre deux isolignes. Si
113; aucun min n''est specifie, on choisit un contour min qui va bien
114; avec l''intervalle specifie!. Si ce mot cle n''est pas specifie, on
115; trace 20 isolignes du min au max. Rq: Qd CONTOUR est active
116; INTERVALLE ne specifie que intervalle entre 2 isolignes coloriees en
117; couleur. Pour specifier l''intervalle entre 2 isolignes traces par un trait
118; de couleur c_lab utiliser CONTINTERVALLE.
119;
120; @keyword INV
121; inverse le vecteur couleur utilise pour colorier le graphe
122;             (sans toucher au noir, au blanc et a la palette utilisee)
123;
124; @keyword LABEL
125; un entier n. si n different de 0, choisit le type de
126; label correspondant aux cas n. cf <pro>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; @keyword COL1d
132; --OBSOLETE--
133; numero de la couleur qd on fait un trace 1d
134;       par defaut, 0. il faut mieux utiliser le mot cle COLOR utilise
135;       par plot
136;
137; @keyword MAXIN
138; permet de specifier la valeur maximum que l''on veut
139;       prendre en compte dans le trace des contours a l''aide d''un
140;       mot cle plutot que par l''argument max. Si l''argument et le
141;       mot cle sont specifies en meme temps, c''est la valeur
142;       specifiee par le mot cle qui est retenue.
143;
144; @keyword MININ
145; permet de specifier la valeur minimum que l''on veut
146;       prendre en compte dans le trace des contours a l''aide d''un
147;       mot cle plutot que par l''argument min. Si l''argument et le
148;       mot cle sont specifies en meme temps, c''est la valeur
149;       specifiee par le mot cle qui est retenue.
150;
151; @keyword NLEVEL
152; nombre de contours a dessiner. par defaut =20. actif si
153; LABEL=0 ou n''est pas specifie.
154;
155; @keyword CONTNLEVEL
156; 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; @keyword OV1D
160; permet de surimprimer un courbe 1d a un precedent trace 1d.
161;
162; @keyword OVERPLOT
163; pour faire un pltt par dessus un autre. Rq:
164;       contrairemnet a l''utilisation de CONTOUR,
165;       l''utilisation de ce mot clef ne modifie pas la legende ou/et
166;       la barre de couleur. dans le cas d''un plot 1d, contrairement
167;       a ov1d, on peut changer les axes et les ranges.
168;
169; @keyword REPEAT_C
170; =n pour repeter une serie temporelle n fois
171;
172; @keyword STRICTFILL
173; activer ce mot clef pour que le remplissage des
174;       contours ce fasse precisement entre le min et le max specifie
175;       en laissant en banc les valeurs inferieurs au min specifie et
176;       superieurs au max specifie.
177;
178; @keyword STYLE
179; style de tracer a adopter pour dessiner les isolignes par
180; defaut style=0. cf <pro>style</pro>
181;
182; @keyword STY1D
183; --OBSOLETE--
184; numero du style utilise lors d''un trace
185;       1d. Il faut mieux utiliser le mot cle LINESTYLE qui est celui
186;       de plot. Attention ce mot cle est encore utile si on veut
187;       faire des barres plutot qu''une courbe, mettre sty1d='bar'
188;
189; @keyword TREND_TYPE
190; modify data by calling <propost_it>trends</propost_it>
191;
192; @keyword TYPEIN
193; permet de specifier la valeur type de hovmoller que
194;        l''on veut faire:
195;             'xt','yt','zt','t'
196;       a l''aide d''un mot cle plutot que par l''argument type Si
197;       l''argument et le mot cle sont specifies en meme temps, c''est
198;       la valeur specifiee par le mot cle qui est retenue.
199;
200; @keyword XT
201;
202; @keyword YT
203;
204; @keyword ZT
205;
206; @keyword TT
207;
208; @keyword _EXTRA
209;
210; @uses
211; <pro>common</pro>
212; <pro>juldate</pro>
213;
214; @todo
215; return dans un PRO ?!
216;
217; validation de type TAB
218;
219; replace juldate call be a non-obsolete function
220;
221; @history
222; - fplod 20100119T160644Z aedon.locean-ipsl.upmc.fr (Darwin)
223;
224;   * check parameters
225;
226; - Sebastien Masson (smasson\@lodyc.jussieu.fr)
227;                       27/5/98
228;
229; - Jerome Vialard (adapting plt to hovmoller drawing)
230;                       2/7/98
231;
232; - Sebastien Masson 14/8/98 (continents,barres)
233;                       15/1/98
234; adaptation pour les tableaux 3 et 4d pour que la moyenne soit faite
235; dans pltt plutot que lors de la lecture.
236;
237; - Sebastien Masson 14/8/98
238;
239; - Eric Guilyardi 29/7/99
240;
241;   * FILTER, TREND_TYPE, REPEAT_C
242;
243; - Sebastien Masson 08/02/2000
244;
245;   * checkfield and usetri keyword.
246;
247; @version
248; $Id$
249;
250;-
251PRO plttg,tab,gaxis,givenmin,givenmax,datmin,datmax $
252    , BOITE=boite $
253    , CONTOUR=contour $
254    , ENDPOINTS=endpoints $
255    , INTERVALLE=intervalle $
256    , INV=inv $
257    , CONTINTERVALLE=contintervalle $
258    , LABEL=label $
259    , CONTLABEL=contlabel $
260    , STYLE=style  $
261    , CONTMAX=contmax $
262    , CONTMIN=contmin $
263    , NLEVEL=nlevel $
264    , CONTNLEVEL=contnlevel $
265    , COL1D=col1d  $
266    , STY1D=sty1d $
267    , MININ=minin $
268    , MAXIN=maxin $
269    , OV1D=ov1d $
270    , FILTER=filter $
271    , TREND_TYPE=trend_type $
272    , REPEAT_C=repeat_c $
273    , TYPEIN=typein $
274    , XT=xt $
275    , YT=yt $
276    , ZT=zt $
277    , TT=tt $
278    , STRICTFILL=strictfill $
279    , OVERPLOT=overplot $
280    , EXCHANGE_XY=exchange_xy $
281    , _EXTRA=extra
282;
283  compile_opt idl2, strictarrsubs
284;
285@common
286
287 usage='plttg,tab,gaxis,givenmin,givenmax,datmin,datmax' $
288    + ', BOITE=boite' $
289    + ', CONTOUR=contour' $
290    + ', ENDPOINTS=endpoints' $
291    + ', INTERVALLE=intervalle' $
292    + ', INV=inv' $
293    + ', CONTINTERVALLE=contintervalle' $
294    + ', LABEL=label' $
295    + ', CONTLABEL=contlabel' $
296    + ', STYLE=style ' $
297    + ', CONTMAX=contmax' $
298    + ', CONTMIN=contmin' $
299    + ', NLEVEL=nlevel' $
300    + ', CONTNLEVEL=contnlevel' $
301    + ', COL1D=col1d ' $
302    + ', STY1D=sty1d' $
303    + ', MININ=minin' $
304    + ', MAXIN=maxin' $
305    + ', OV1D=ov1d' $
306    + ', FILTER=filter' $
307    + ', TREND_TYPE=trend_type' $
308    + ', REPEAT_C=repeat_c' $
309    + ', TYPEIN=typein' $
310    + ', XT=xt' $
311    + ', YT=yt' $
312    + ', ZT=zt' $
313    + ', TT=tt' $
314    + ', STRICTFILL=strictfill' $
315    + ', OVERPLOT=overplot' $
316    + ', EXCHANGE_XY=exchange_xy' $
317    + ', _EXTRA=extra'
318;
319 nparam = N_PARAMS()
320 IF (nparam LT 6) THEN BEGIN
321    ras = report(['Incorrect number of arguments.' $
322          + '!C' $
323          + 'Usage : ' + usage])
324    stop
325 ENDIF
326
327   giventype = 'yt'
328;------------------------------------------------------------
329   tempsun = systime(1)         ; pour key_performance
330;--------------------------------------------------------------
331; I2) reinitialisation. !p.,!x.,!y.
332; Rq: on ne reinitialise pas qd on rapelle plt en boucle pour utiliser contour
333;--------------------------------------------------------------
334   IF n_elements(contour) ne 4 AND NOT keyword_set(overplot) $
335    AND NOT keyword_set(ov1d) THEN BEGIN
336    reinitplt
337   ENDIF
338;--------------------------------------------------------------
339; I1) lecture du champ
340;--------------------------------------------------------------
341   IF keyword_set(boite) THEN BEGIN
342    oldboite = [lon1, lon2, lat1, lat2, prof1, prof2]
343   ENDIF
344   IF n_elements(giventype) NE 0 THEN BEGIN
345    type = giventype
346   ENDIF
347   IF n_elements(givenmin) NE 0 THEN BEGIN
348    min = givenmin
349   ENDIF
350   IF n_elements(givenmax) NE 0 THEN BEGIN
351    max = givenmax
352   ENDIF
353   IF n_elements(minin) NE 0 THEN BEGIN
354    min = minin
355   ENDIF
356   IF n_elements(maxin) NE 0 THEN BEGIN
357    max = maxin
358   ENDIF
359   IF keyword_set(typein) THEN BEGIN
360      IF size(type, /type) NE 7 AND size(type, /type) NE 0 THEN BEGIN
361         IF n_elements(min) NE 0 THEN BEGIN
362          max = min
363         ENDIF
364         min = type
365      ENDIF
366      type = typein
367   ENDIF
368
369   z2d = tab
370   mask = 1
371
372;---------------------------------------------------------------
373; selection du type de graphique.
374;---------------------------------------------------------------
375;---------------------------------------------------------------
376; repetition de la serie temporelle
377;---------------------------------------------------------------
378
379   IF NOT keyword_set(repeat_c) THEN BEGIN
380    repeat_c = 1
381   ENDIF
382
383   temps = time[0:jpt-1]
384   IF repeat_c GT 1 THEN BEGIN
385      taille=size(z2d)
386      CASE taille[0] OF
387         1: z2d = reform(z2d#replicate(1, repeat_c), taille[1]*repeat_c)
388         2: BEGIN
389            z2d = z2d[*]#replicate(1, repeat_c)
390            z2d = reform(z2d, taille[1], taille[2]*repeat_c, /over)
391         END
392         ELSE:
393      ENDCASE
394      temps = [temps, (lindgen(jpt*(REPEAT_c-1))+1)*(temps[1]-temps[0])+temps[jpt-1]]
395   ENDIF
396
397;----------------------------------------------------------------------------
398;   determination du mi:min et du ma:max de z2d ainsi que de max: max et
399;    min: min pour le dessin.
400;-----------------------------------------------------------------------------
401; faudra-t-il faire un autoscale ???
402   autoscale = testvar(var = min) EQ testvar(var = max) AND NOT keyword_set(intervalle)
403   determineminmax, z2d, mask, mi, ma, MININ = min, MAXIN = max, nan = nan, INTERVALLE = intervalle
404   IF z2d[0] EQ -1 THEN BEGIN
405    return
406   ENDIF
407; on fait un autoscale si besoin
408   IF autoscale THEN BEGIN
409    autoscale, min, max, intervalle
410   ENDIF
411;-----------------------------------------------------------------------------
412;-----------------------------------------------------------------------------
413   IF n_elements(contour) ne 4  AND NOT keyword_set(overplot) THEN BEGIN
414    placedessin, 'pltt',posfenetre, posbar, contour = contour, direc = direc, type = type, endpoints = endpoints, _EXTRA=extra
415   ENDIF
416;--------------------------------------------------------------
417;--------------------------------------------------------------
418; 2eme partie: dessin
419;--------------------------------------------------------------
420;-----------------------------------------------------------
421;   definition des axes
422;----------------------------------------------------------
423;-----------------------------------------------------------------------------
424; definition des vecteurs abscisse et ordonee
425; la triangulation est definie pour que le trace soit effectue du bas
426; a gauche vers le haut a droite. il faut donc la matrice e contourer
427; se presente de cette maniere, d''ou certains transpose et reverse
428;-----------------------------------------------------------------------------
429;-----------------------------------------------------------------------------
430; definition des bornes de l''axe temporel
431;-----------------------------------------------------------------------------
432   CASE N_PARAMS() OF
433      5 : BEGIN
434         tempsmin = juldate(datmin, _EXTRA=extra)
435         tempsmax = temps[(jpt*repeat_c)-1]
436      END
437      6 : BEGIN
438         tempsmin = juldate(datmin, _EXTRA=extra)
439         tempsmax = juldate(datmax, _EXTRA=extra)
440      END
441      ELSE: BEGIN
442         tempsmin = temps[0]
443         tempsmax = temps[(jpt*repeat_c)-1]
444      END
445   ENDCASE
446;-----------------------------------------------------------------------------
447; on shift l''axe du temps pour des questions de precision sur les
448; dates du calendier julien en long qui sont passes en float ds les axes
449   yy = gaxis
450   xx = temps-tempsmin
451;--------------------------------------------------------------
452   IF NOT keyword_set(overplot) THEN BEGIN
453    axe, type, tempsmin, tempsmax, plttg = 1, _EXTRA=extra
454   ENDIF ELSE BEGIN
455      !x.range=!x.range-tempsmin
456      !x.tickv=!x.tickv-tempsmin
457   ENDELSE
458;------------------------------------------------------------
459;------------------------------------------------------------
460; dessin
461;------------------------------------------------------------
462; 2d
463;------------------------------------------------------------
464;--------------------------------------------------------------
465; choix des labels
466;-----------------------------------------------------------
467   IF keyword_set(intervalle) AND NOT keyword_set(label) THEN BEGIN
468    label=1
469   ENDIF
470   IF keyword_set(label) eq 0 THEN BEGIN
471    cas=0
472   ENDIF ELSE BEGIN
473    cas=label
474   ENDELSE
475   label,cas,min,max,ncontour,level_z2d,NLEVEL=nlevel,INTERVALLE=intervalle, strictfill = strictfill
476;--------------------------------------------------------------
477; choix de style
478;-----------------------------------------------------------
479   IF not keyword_set(style) THEN BEGIN
480    style=0
481   ENDIF
482   style,style,level_z2d,linestyle,thick
483   IF keyword_set(inv) THEN BEGIN
484    couleur=reverse(couleur)
485   ENDIF
486;----------------------------------------------------------------------
487   nby = n_elements(yy)
488   nbx = n_elements(xx)
489   xx = xx#replicate(1, nby)    ; on passe les axes en tableaux 2d
490   yy = replicate(1, nbx)#yy
491
492   triangulation = -1
493;----------------------------------------------------------------------
494   pltbase,z2d, xx, yy, mask,xx, yy, level_z2d, couleur, contour = contour,/noerase $
495    , c_linestyle=linestyle,c_labels=1-(indgen(n_elements(level_z2d)) MOD 2) $
496    , trichamp = triangulation, trimsk = triangulation, overplot = overplot $
497    , c_thick=thick, performance = key_performance, usetri = keyword_set(nan) $
498    , coinmontemask=coinmontemask, coindescendmask=coindescendmask, _EXTRA=extra
499;------------------------------------------------------------
500   IF n_elements(contour) eq 4 THEN BEGIN ; c''est la 2eme fois que je passe ds pltt
501      contour = {mietma:[mi, ma], unit:varunit, inter:intervalle} ; je renvoie le min, le max et l''unite
502      return
503   ENDIF
504;------------------------------------------------------------
505   IF keyword_set(contour) THEN BEGIN
506      pourlegende = [1, 1, 1, 1]
507      oldattributs = saveatt()
508      oldcouleur = couleur
509      plttg,contour,gaxis, contmin,contmax,CONTOUR=pourlegende, /noerase, USETRI = usetri $
510       ,INTERVALLE=contintervalle,LABEL=contlabel,STYLE=style, ENDPOINTS = endpoints $
511       ,NLEVEL=contnlevel,YSURX=ysurx, BOITE = boite, STRICTFILL = strictfill, _EXTRA=extra
512      couleur = oldcouleur
513      restoreatt, oldattributs
514   ENDIF
515;----------------------------------------------------------------------
516;----------------------------------------------------------------------
517   IF keyword_set(overplot) THEN BEGIN
518    GOTO, fini
519   ENDIF
520;------------------------------------------------------------
521; legendes + affichage de celles-ci
522;------------------------------------------------------------
523   legende,mi,ma,type, CONTOUR = pourlegende, DIREC = direc, INTERVALLE = intervalle $
524    , plttg = 1, _EXTRA=extra
525   plot,[0],[0],/noerase,/nodata,color=c_cote, xstyle = 1, ystyle = 1
526
527;------------------------------------------------------------
528; barre de couleur
529;------------------------------------------------------------
530   couleur = couleur[0:ncontour-1-keyword_set(strictfill)]
531   barrecouleur, position=posbar,divisions=(ncontour-keyword_set(strictfill))/2,min=min $
532    , max=max,discret=couleur,_EXTRA=extra
533;------------------------------------------------------------
534fini:
535;------------------------------------------------------------
536; on remet l''axe du temps en jours julien IDL et non pas en jours
537; juliens comptes a partir tempsmin
538;------------------------------------------------------------
539   !x.range=!x.range+tempsmin
540   !x.tickv=!x.tickv+tempsmin
541; on fait un faux plot pour que ces valeurs soient prises en
542; consideration
543   plot,[0], [0], /noerase,xstyle=5, ystyle = 5, title = '', subtitle = '', ytitle = '', xtitle = ''
544;------------------------------------------------------------
545;------------------------------------------------------------
546   terminedessin, _EXTRA=extra
547   IF keyword_set(oldboite) THEN BEGIN
548    domdef, oldboite,GRILLE=[vargrid, 'T']
549   ENDIF
550;------------------------------------------------------------
551   IF n_elements(key_performance) NE 0 THEN BEGIN
552    IF key_performance EQ 1 THEN BEGIN
553     print, 'temps pltt', systime(1)-tempsun
554    ENDIF
555   ENDIF
556end
Note: See TracBrowser for help on using the repository browser.