source: trunk/SRC/ToBeReviewed/PLOTS/DESSINE/pltt.pro @ 114

Last change on this file since 114 was 114, checked in by smasson, 18 years ago

new compilation options (compile_opt idl2, strictarrsubs) in each routine

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 31.7 KB
Line 
1;------------------------------------------------------------
2;+
3; NAME:
4;       PLTT
5;
6; PURPOSE:
7;       trace des graphes hovmoller
8;
9; CATEGORY:
10;       Graphics, trace des graphes hovmoller: xt,yt,zt,t
11;
12; CALLING SEQUENCE:
13;       pltt, champ,type [,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 BOXZOOM
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 BOXZOOM
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;             'xt','yt','zt','t' 
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;       BOXZOOM:vecteur indiquant la zone geographique (3d) sur laquelle doit
56; etre fait l''extraction du champ pour faire le hovmoeller.
57; Si BOXZOOM a :
58; 1 element : l''extraction est faite sur [lon1, lon2, lat1, lat2, 0.,boxzoom[0]]
59; 2 elements: l''extraction est faite sur [lon1, lon2, lat1, lat2, boxzoom[0],boxzoom[1]]
60; 4 elements: l''extraction est faite sur [Boxzoom, vert1, vert2]
61; 5 elements: l''extraction est faite sur [Boxzoom[0:3], 0, Boxzoom[4]]
62; 6 elements: l''extraction est faite sur Boxzoom
63;
64; Ou lon1, lon2,lat1,lat2,vert1,vert2 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;        COAST_COLOR: the color of the coastline.
74;                     defaut value is 0 => black
75;
76;        COAST_THICK: the thickness of the coastline.
77;                     defaut value is 1
78;
79;        /CONT_NOFILL: activer pour ne pas remplir les points masques
80;        pour les laisser en transparent!
81;        Rq: on trace qd meme le contour du mask
82;
83;        CONT_COLOR: the color of the continent. defaut value is
84;        (!d.n_colors - 1) < 255 => white
85;
86;       CONTINTERVALLE: lorsque CONTOUR est active, valeur d''un
87; intervalle entre deux isolignes traces par un trait. Il peut ainsi
88; etre different de celui specifie par INTERVALLE
89; qui, cas ce cas, ne controle que les isolignes coloriees en
90; couleurs. Si aucun min n''est specifie, on choisit un contour min qui va
91; bien avec l''intervalle specifie!. Si ce mot cle n''est pas
92; specifie, on trace 20 isolignes du min au max.
93;
94;       CONTLABEL: un entier n. lorsque CONTOUR est active, si n
95; different de 0, choisit le type de label correspondant aux cas n
96; pour les isolignes tracees par un trait. Pour specifier le type de
97; label du contour en couleur, utiliser LABEL
98;
99;       CONTMAX: lorsque CONTOUR est active, valeur maximum que l''on
100; veut prendre en compte dans le trace des isolignes traces par un
101; trait. Par defaut on prend le max (sur les pts mer)
102; du tableau passe ds le mot cle CONTOUR.
103;
104;       CONTMIN: lorsque CONTOUR est active, valeur minimum que l''on
105; veut prendre en compte dans le trace des isolignes traces par un
106; trait. Par defaut on prend le max (sur les pts mer)
107; du tableau passe ds le mot cle CONTOUR.
108;
109;       CONTNLEVEL: lorsque CONTOUR est active, nombre de contours
110; trace par un trait a dessiner (actif si
111; CONTLABEL=0) par defaut =20.
112;
113;       CONTOUR: si on veut tracer les contours d''un champ different que celui
114; que l''on dessin en couleur (par ex E-P en couleur et QSR en
115; contours). Doit etre un champ reponadnt aux meme caracteristiques
116; que l''argument numero 1 de pltt
117;
118;       ENDPOINTS: mot clef specifiant que l'on veut faire une coupe
119;       verticale en diagonale. les coordonnees des extremites de
120;       celle-ci sont alors definies les 4 elements du vecteur
121;       ENDPOINTS: [x1,y1,x2,y2] qui sont les coordonnees
122;
123;       /EXCHANGE_XY: permet d''intervertir les axes.
124;
125;       FILTER: applique une moyenne glissante de largeur FILTER
126;
127;       INTERVALLE: valeur d''un intervalle entre deux isolignes. Si
128; aucun min n''est specifie, on choisit un contour min qui va bien
129; avec l''intervalle specifie!. Si ce mot cle n''est pas specifie, on
130; trace 20 isolignes du min au max. Rq: Qd CONTOUR est active
131; INTERVALLE ne specifie que intervalle entre 2 isolignes coloriees en
132; couleur. Pour specifier l''intervalle entre 2 isolignes traces par un trait
133; utiliser CONTINTERVALLE.
134;
135;       /INV: inverse le vecteur couleur utilise pour colorier le graphe
136;             (sans toucher au noir, au blanc et a la palette utilisee)
137;
138;       LABEL: un entier n. si n different de 0, choisit le type de
139; label correspondant aux cas n. cf label.pro
140; Rq: Qd CONTOUR est active, ne specifie le type de label que pour les
141; isolignes coloriees en couleur. Pour celles tracees par un trait
142; utiliser CONTLABEL.
143;
144;       /LANDSCAPE: oblige la feuille ou le fenetre a l''ecran a etre
145;       en position "allongee".
146;       
147;       LCT: entier designant le numero de la palette de couleur que
148;       l''on veut utiliser pour le plot.
149;       
150;       COL1d: --OBSOLETE--numero de la couleur qd on fait un trace 1d
151;       par defaut, 0. il faut mieux utiliser le mot cle COLOR utilise
152;       par plot
153;
154;       MAXIN: permet de specifier la valeur maximum que l''on veut
155;       prendre en compte dans le trace des contours a l''aide d''un
156;       mot cle plutot que par l''argument max. Si l''argument et le
157;       mot cle sont specifies en meme temps, c''est la valeur
158;       specifiee par le mot cle qui est retenue.
159;
160;       MININ: permet de specifier la valeur minimum que l''on veut
161;       prendre en compte dans le trace des contours a l''aide d''un
162;       mot cle plutot que par l''argument min. Si l''argument et le
163;       mot cle sont specifies en meme temps, c''est la valeur
164;       specifiee par le mot cle qui est retenue.
165;
166;       NLEVEL: nombre de contours a dessiner. par defaut =20. actif si
167; LABEL=0 ou n''est pas specifie.
168;
169;       CONTNLEVEL: nombre de contours a dessiner qd on utilise ajoutcontour
170; active par le mot cle CONTOUR.(actif si CONTLABEL=0) par defaut =20.
171;
172;       /NOCOLORBAR: activer si on ne veut pas de colorbar
173;
174;       /NOCONTOUR: activer si on ne veut pas de contour mais juste
175;       les couleurs
176;
177;       /NOFILL: activer si on veut juste les contours en noir et
178;       blanc sur fond blanc
179;
180;       /NOERASE: activer pour faire un dessin a l''ecran sans creer
181; une nouvelle fenetre. Rq: activer ds le cas d''un Postscript de
182; plusieurs traces de type 't' pour ne pas faire un Postscript de
183; plusieurs pages
184;
185;       /OV1D:permet de surimprimer un courbe 1d a un precedent trace 1d.
186;
187;       OVERPLOT: pour faire un pltt par dessus un autre. Rq:
188;       contrairemnet a l''utilisation de CONTOUR,
189;       l''utilisation de ce mot clef ne modifie pas la legende ou/et
190;       la barre de couleur. dans le cas d''un plot 1d, contrairement
191;       a ov1d, on peut changer les axes et les ranges.
192;
193;       PETITDESSIN: vecteur de 3 ou 4 elements, applique pour faire un
194; dessin sur une petite portion de feuille ou d''ecran. il delimite
195; la zone ds laquelle va etre fait le dessin
196; si il a 4 elements:
197;       il est alors constitute des coordonnees -exprime en cm reperes par
198;       rapport au coin en bas a gauche de la feuille ou de la fenetre
199;       (en portrait comme en landscape)- du coin en bas a
200;       gauche et du coin en haut a droite  de la zone de dessin.
201; si il a 3 elements:
202;       Ds ce cas, on divise la fenetre ou l''ecran en PETITDESSIN[0]
203;       colonnes, en PETITDESSIN[1] lignes le dessin se faisant ds la
204;       case numero PETITDESSIN[2].La numerotation commencant en haut
205;       a gauche par le numero 1 et suivant apres dans le sens de
206;       l''ecriture.
207; Par defaut on fait un dessin occupant la plus grande place possible
208; tout en concervant le rapport d''aspect (sauf qd REMPLI est active)
209;
210;       /PORTRAIT: oblige la feuille ou la fenetre a etre en position "debout".
211;
212;       /POST: faire une sortie postscript. Ne marche que si on fait
213;       un seul dessin sur la feuille. Si on fait plusieurs dessins,
214;       utiliser @ps ou plein2dessins
215;
216;       REPEAT_C=n pour repeter une serie temporelle n fois
217;
218;       /REMPLI:oblige le dessin a occuper l''espace maximum definit
219;       par petitdessin
220;
221;       /REVERSE_X: pour inverser l''axe des x (et aussi le dessin)
222;
223;       /REVERSE_Y: pour inverser l''axe des y (et aussi le dessin)
224;
225;       /STRICTFILL: activer ce mot clef pour que le remplissage des
226;       contours ce fasse precisement entre le min et le max specifie
227;       en laissant en banc les valeurs inferieurs au min specifie et
228;       superieurs au max specifie.
229;
230;       STYLE: style de tracer a adopter pour dessiner les isolignes par
231; defaut style=0. cf style.pro
232;
233;       STY1D: --OBSOLETE--numero du style utilise lors d''un trace
234;       1d. Il faut mieux utiliser le mot cle LINESTYLE qui est celui
235;       de plot. Attention ce mot cle est encore utile si on veut
236;       faire des barres plutot qu''une courbe, mettre sty1d='bar'
237;
238;       /TRANS: fait un postscript (active /post automatiquement) et l''imprime
239; -si on le desire- sur un transparant
240;
241;        TREND_TYPE: modify data by calling trends.pro
242;
243;        TYPEIN: permet de specifier la valeur type de hovmoller que
244;        l''on veut faire:
245;             'xt','yt','zt','t' 
246;       a l''aide d''un mot cle plutot que par l''argument type Si
247;       l''argument et le mot cle sont specifies en meme temps, c''est
248;       la valeur specifiee par le mot cle qui est retenue.
249;
250;       /USETRI: pour forcer a utiliser de triangulation.
251;
252;        UNLABSUR: entier n. specifant qu''on ne labelle qu''un
253;        contour sur n. Par defaut unlabsur=2
254;
255;       /UNSUR2: si on veut tracer un countour sur deux. par  defaut trace
256; tous les contours
257;
258;       WINDOW: nimero de la fenetre ou l''on veut faire le graphe (permet
259; d'ouvrir plusieurs fenetres). par defaut on ouvre 'IDL0'
260;
261;       YXASPECT: rapport d'echelle entre y et x. Par defaut=1
262; Par defaut on adapte pour occupe une grande partie de la feuille en sortie
263; postScript ou pour cree une fenetre pas trop etiree
264;
265;       /ZEROMIDDLE: fo force the middle of the colorbar to be equal
266;       to 0 (force max=max(abs([min,max])) and min=-max)
267;
268; COMMON BLOCKS:
269;       common.pro
270;
271; SIDE EFFECTS:
272;
273; RESTRICTIONS:
274;
275; EXAMPLE:
276;
277; MODIFICATION HISTORY: Sebastien Masson (smasson@lodyc.jussieu.fr)
278;                       27/5/98
279;                       Jerome Vialard (adapting plt to hovmoller drawing)
280;                       2/7/98
281;                       Sebastien Masson 14/8/98 (continents,barres)
282;                       15/1/98
283; adaptation pour les tableaux 3 et 4d pour que la moyenne soit faite
284; dans pltt plutot que lors de la lecture.
285;                       Sebastien Masson 14/8/98
286;                       7/1999
287;                       Eric Guilyardi 29/7/99 FILTER, TREND_TYPE,
288;                       REPEAT_C
289;                       Sebastien Masson 08/02/2000 checkfield and
290;                       usetri keyword.
291;-
292;------------------------------------------------------------
293;------------------------------------------------------------
294;------------------------------------------------------------
295pro pltt,tab,giventype,givenmin,givenmax,datmin,datmax,BOXZOOM = boxzoom, CONTOUR=contour $
296         ,ENDPOINTS=endpoints,INTERVALLE=intervalle,INV=inv  $
297         ,CONTINTERVALLE=contintervalle,LABEL=label,CONTLABEL=contlabel $
298         ,STYLE=style, CONTMAX=contmax $
299         ,CONTMIN=contmin,NLEVEL=nlevel,CONTNLEVEL=contnlevel $
300         ,COL1D=col1d,STY1D=sty1d, MININ = minin, MAXIN = maxin $
301         ,OV1D=ov1d, FILTER = filter, TREND_TYPE = trend_type $
302         ,REPEAT_C = repeat_c, TYPEIN = typein, XT = XT, YT = YT, ZT = zt $
303         , TT = tt, STRICTFILL = strictfill, OVERPLOT = overplot $
304         , EXCHANGE_XY = exchange_xy $
305         , _extra = ex
306;---------------------------------------------------------
307; include common
308;
309  compile_opt idl2, strictarrsubs
310;
311@cm_4mesh
312@cm_4data
313@cm_4cal
314  IF NOT keyword_set(key_forgetold) THEN BEGIN
315@updatenew
316@updatekwd
317  ENDIF
318;--------------------------------------------------------------
319;------------------------------------------------------------
320   tempsun = systime(1)         ; pour key_performance
321;--------------------------------------------------------------
322; I2) reinitialisation. !p.,!x.,!y.
323; Rq: on ne reinitialise pas qd on rapelle plt en boucle pour utiliser contour
324;--------------------------------------------------------------
325   if n_elements(contour) ne 4 AND NOT keyword_set(overplot) $
326    AND NOT keyword_set(ov1d) then reinitplt
327;--------------------------------------------------------------
328; I1) lecture du champ
329;--------------------------------------------------------------
330   if (keyword_set(boxzoom) OR keyword_set(endpoints)) $
331     AND n_elements(contour) ne 4 THEN BEGIN
332     savedbox = 1b
333     saveboxparam, 'boxparam4pltt.dat'
334   ENDIF
335   if n_elements(giventype) NE 0 then type = giventype
336   if n_elements(givenmin) NE 0 then min = givenmin
337   if n_elements(givenmax) NE 0 then max = givenmax
338   if n_elements(minin) NE 0 then min = minin
339   if n_elements(maxin) NE 0 then max = maxin
340   if keyword_set(typein) then BEGIN
341      if size(type, /type) NE 7 AND size(type, /type) NE 0 then begin
342         if n_elements(min) NE 0 then max = min
343         min = type
344      endif
345      type = typein
346    ENDIF
347;
348   checktypeminmax, 'pltt', TYPE = type, MIN = min, MAX = max $
349     , XT = XT, YT = YT, ZT = zt, TT = tt, ENDPOINTS = endpoints, _extra = ex
350;
351   if keyword_set(endpoints) then begin
352      section, tab, z2d, glam, gphi, ENDPOINTS = endpoints, TYPE = type $
353        , BOXZOOM = boxzoom, DIREC = direc
354      nx = n_elements(glam)
355      ny = nx
356      if strupcase(vargrid) EQ 'W' then begin
357         z = gdepw[firstzw:lastzw]
358         nz = nzw
359      ENDIF ELSE BEGIN
360         z = gdept[firstzt:lastzt]
361         nz = nzt
362      ENDELSE
363   ENDIF ELSE BEGIN
364      z2d = checkfield(tab, 'pltt', TYPE = type, BOXZOOM = boxzoom $
365                       , direc = direc, _extra = ex)
366      if z2d[0] EQ -1 then BEGIN
367        IF keyword_set(savedbox) THEN restoreboxparam, 'boxparam4pltt.dat'
368        return
369      endif
370      grille, mask, glam, gphi, gdep, nx, ny,nz
371   ENDELSE
372;---------------------------------------------------------------
373; calcul de tendance/anomaly suivant TREND_TYPE
374;---------------------------------------------------------------
375
376   IF NOT keyword_set(trend_type) THEN trend_type = 0
377
378   IF trend_type GT 0 THEN z2d = trends(z2d, trend_type, type)
379
380;---------------------------------------------------------------
381; filtrage des donnee dans le cas 't'
382;---------------------------------------------------------------
383
384   IF type EQ 't' AND keyword_set(filter) THEN BEGIN
385      print, '    Applying a running mean filter of width '+string(filter, format = '(I3)')
386      z2d = smooth(z2d, filter)
387      z2d[0:filter/2-1] = 0.
388      z2d[(size(z2d))[1]-filter/2-1:(size(z2d))[1]-1] = 0.
389   ENDIF
390
391;---------------------------------------------------------------
392; repetition de la serie temporelle
393;---------------------------------------------------------------
394
395   IF NOT keyword_set(repeat_c) THEN repeat_c = 1
396
397   temps = time[0:jpt-1]
398   IF repeat_c GT 1 THEN BEGIN
399      taille=size(z2d)
400      CASE taille[0] OF
401         1: z2d = reform(z2d#replicate(1, repeat_c), taille[1]*repeat_c)
402         2: BEGIN
403            z2d = z2d[*]#replicate(1, repeat_c)
404            z2d = reform(z2d, taille[1], taille[2]*repeat_c, /over)
405         END
406         ELSE:
407      ENDCASE
408      temps = [temps, (lindgen(jpt*(REPEAT_c-1))+1)*(temps[1]-temps[0])+temps[jpt-1]]
409   ENDIF
410
411;---------------------------------------------------------------
412; selection du type de graphique.
413;---------------------------------------------------------------
414   taille=size(z2d)
415   case taille[0] of
416      2 : typdes='2d'
417      1 : begin
418         z1d=z2d
419         typdes='1d'
420         if keyword_set(OV1D) then begin
421            yy = z2d
422            if n_elements(datmin) NE 0 then tempsmin = date2jul(datmin) $
423            ELSE tempsmin = temps[0]
424; on shift l''axe du temps pour des questions de precision sur les
425; dates du calendier julien en long qui sont passes en float ds les axes
426            xx = temps-tempsmin
427            !x.range=!x.range-tempsmin
428            !x.tickv=!x.tickv-tempsmin
429; on fait un faux plot pour appliquer ces changements!
430            plot,[0], [0],/noerase,xstyle=5, ystyle = 5, title = '', subtitle = '', ytitle = '', xtitle = ''
431            goto, trace1d
432         endif
433      end
434   endcase
435; on construit le mask pour cela le tableau doit etre masque (fait
436; automatiquement a la valeur valmask si on passe ds moyenne ou grossemoyenne)
437   nan = total(finite(z2d,/nan)) < 1
438   if n_elements(valmask) EQ 0 then valmask = 1e20
439   if keyword_set(nan) then begin
440      notanum = where(finite(z2d) EQ 0)
441      z2d[notanum] = 0.
442      mask = z2d LT valmask/10.
443      z2d[notanum] = !values.f_nan
444   ENDIF ELSE mask = z2d LT valmask/10.
445;----------------------------------------------------------------------------
446;   determination du mi:min et du ma:max de z2d ainsi que de max: max et
447;    min: min pour le dessin.
448;-----------------------------------------------------------------------------
449; faudra-t-il faire un autoscale ???
450   autoscale = testvar(var = min) EQ testvar(var = max) AND NOT keyword_set(intervalle)
451   determineminmax, z2d, mask, mi, ma, MININ = min, MAXIN = max, nan = nan, INTERVALLE = intervalle, _extra = ex
452   if z2d[0] EQ -1 THEN return
453; on fait un autoscale si besoin
454   if autoscale then autoscale, min, max, intervalle
455;-----------------------------------------------------------------------------
456;-----------------------------------------------------------------------------
457   if n_elements(contour) ne 4  AND NOT keyword_set(overplot) THEN $
458    placedessin, 'pltt',posfenetre, posbar, contour = contour, direc = direc, type = type, endpoints = endpoints, _extra = ex
459;--------------------------------------------------------------
460;--------------------------------------------------------------
461; 2eme partie: dessin
462;--------------------------------------------------------------
463;-----------------------------------------------------------
464;   definition des axes
465;----------------------------------------------------------
466;-----------------------------------------------------------------------------
467; definition des vecteurs abscisse et ordonee
468; la triangulation est definie pour que le trace soit effectue du bas
469; a gauche vers le haut a droite. il faut donc la matrice e contourer
470; se presente de cette maniere, d''ou certains transpose et reverse
471;-----------------------------------------------------------------------------
472;-----------------------------------------------------------------------------
473; definition des bornes de l''axe temporel
474;-----------------------------------------------------------------------------
475   case N_PARAMS() OF
476      5 : begin
477         tempsmin = date2jul(datmin)
478         tempsmax = temps[(jpt*repeat_c)-1]
479      end
480      6 : begin
481         tempsmin = date2jul(datmin)
482         tempsmax = date2jul(datmax)
483      end
484      else : begin
485         tempsmin = temps[0]
486         tempsmax = temps[(jpt*repeat_c)-1]
487      end
488   endcase
489;-----------------------------------------------------------------------------
490; on shift l''axe du temps pour des questions de precision sur les
491; dates du calendier julien en long qui sont passes en float ds les axes
492   case typdes of
493      '1d' : begin
494         yy = z1d
495         xx = temps-tempsmin
496      end
497      '2d' : begin
498         case 1 of
499            type eq 'xt' : BEGIN
500               xx = glam[*, 0]
501               yy = temps-tempsmin
502            end
503            type eq 'yt' : begin
504               IF (size(gphi))[0] EQ 1 then yy = gphi ELSE BEGIN
505                 IF keyword_set(key_irregular) THEN BEGIN
506                   cln = (where(gphi EQ max(gphi)))[0]
507                   yy = reform(gphi[cln MOD nx, *])
508                 ENDIF ELSE yy = reform(gphi[0, *])
509               ENDELSE
510               xx = temps-tempsmin
511               z2d = transpose(z2d)
512               mask = transpose(mask)
513            end
514            type eq 'zt' : begin
515               yy =  gdep
516               xx = temps-tempsmin
517               z2d = transpose(z2d)
518               mask = transpose(mask)
519            end
520         endcase
521      end
522   endcase
523;--------------------------------------------------------------
524   if NOT keyword_set(overplot) THEN axe, type, tempsmin, tempsmax, _EXTRA = ex ELSE BEGIN
525      if type EQ 'xt' then BEGIN
526         !y.range=!y.range-tempsmin
527         !y.tickv=!y.tickv-tempsmin
528      ENDIF ELSE BEGIN
529         !x.range=!x.range-tempsmin
530         !x.tickv=!x.tickv-tempsmin
531      ENDELSE
532   ENDELSE
533;------------------------------------------------------------
534;------------------------------------------------------------
535; dessin
536;------------------------------------------------------------
537; 2d
538;------------------------------------------------------------
539   if (typdes eq '2d') then begin
540;--------------------------------------------------------------
541; choix des labels
542;-----------------------------------------------------------
543      if keyword_set(intervalle) AND NOT keyword_set(label) then label=1
544      if keyword_set(label) eq 0 then cas=0 else cas=label
545      label, cas, min, max, ncontour, level_z2d, colnumb, NLEVEL = nlevel $
546             , INTERVALLE = intervalle, strictfill = strictfill
547;--------------------------------------------------------------
548; choix de style
549;-----------------------------------------------------------
550      if not keyword_set(style) then style=0
551      style,style,level_z2d,linestyle,thick
552      if keyword_set(inv) then colnumb=reverse(colnumb)
553;----------------------------------------------------------------------
554      nby = n_elements(yy)
555      nbx = n_elements(xx)
556;
557      if keyword_set(nan) then BEGIN
558;         xx = xx#replicate(1, nby) ; on passe les axes en tableaux 2d
559;         yy = replicate(1, nbx)#yy
560         masknan = finite(z2d)
561         z2d[where(masknan EQ 0)] = max
562         mask = temporary(mask)*temporary(masknan)
563      ENDIF
564      z2d = remplit(z2d,nite=2+keyword_set(nan), mask = mask, /basique, _extra=ex)
565      if NOT keyword_set(strictfill) then z2d = min > z2d <  max
566      if keyword_set(nan) then $
567       triangulation = triangule(mask,/basic,coinmonte=coinmontemask $
568                                 ,coindescend=coindescendmask) $
569       ELSE triangulation = -1
570;----------------------------------------------------------------------
571      pltbase,z2d, xx, yy, mask,xx, yy, level_z2d,colnumb, contour = contour,/noerase $
572       , c_linestyle=linestyle,c_labels=1-(indgen(n_elements(level_z2d)) MOD 2) $
573       , trichamp = triangulation, trimsk = triangulation, overplot = overplot $
574       , c_thick=thick, performance = key_performance, usetri = keyword_set(nan) $
575       , coinmontemask=coinmontemask, coindescendmask=coindescendmask, _extra = ex
576;------------------------------------------------------------
577      if n_elements(contour) eq 4 then BEGIN ; c''est la 2eme fois que je passe ds pltt
578         contour = {mietma:[mi, ma], unit:varunit, inter:intervalle} ; je renvoie le min, le max et l''unite
579         return
580      endif
581;------------------------------------------------------------
582      if keyword_set(contour) then BEGIN
583         pourlegende = [1, 1, 1, 1]
584         oldattributs = saveatt()
585         oldcolnumb = colnumb
586         pltt,contour,type, contmin,contmax,CONTOUR=pourlegende, /noerase, USETRI = usetri $
587          ,INTERVALLE=contintervalle,LABEL=contlabel,STYLE=style, ENDPOINTS = endpoints $
588           , NLEVEL = contnlevel, BOXZOOM = boxzoom, STRICTFILL = strictfill, _extra = ex
589         colnumb = oldcolnumb
590         restoreatt, oldattributs
591      endif
592;----------------------------------------------------------------------
593;----------------------------------------------------------------------
594      if keyword_set(overplot) then GOTO, fini
595;------------------------------------------------------------
596; Trace de la ligne de changement de date or the equator
597;------------------------------------------------------------
598      IF key_onearth THEN BEGIN
599        CASE type OF
600          'xt':oplot, [180, 180] - 360*(!x.range[1] LT 180), !y.range
601          'yt':oplot, !x.range, [0, 0]
602          ELSE:
603        ENDCASE
604      ENDIF
605;------------------------------------------------------------
606; legendes + affichage de celles-ci
607;------------------------------------------------------------
608      legende,mi,ma,type, CONTOUR = pourlegende, DIREC = direc, INTERVALLE = intervalle $
609       , ENDPOINTS = endpoints, _extra = ex
610;
611; we want to draw the time axis with tick length = 1. if we simply
612; use [xy]style=1 then each axis (up and down or left and right) have
613; majorticks with a length of 1 (-> not very nice when xgridstyle=2),
614; same if xticklen=0.5 (not very nice in the middle). => so we draw
615; the top (right) axis by hand using axis.
616;
617      if n_elements(ex) NE 0 then BEGIN
618; pour avoir un cadre de la couleur noire
619        if (where(tag_names(ex) EQ 'COLOR'))[0] NE -1 then ex.COLOR = 0
620      ENDIF
621;
622      plot, [0], [0], /nodata, /noerase, _extra = ex $
623        , xstyle = 1+4*(keyword_set(endpoints) AND type EQ 'xt' AND lat1 NE lat2)+8*(type EQ 'yt' OR type EQ 'zt') $
624        , ystyle = 1+4*(keyword_set(endpoints) AND type EQ 'yt')+8*(type EQ 'xt')
625; call axis for the missing axis.
626      IF type EQ 'xt' AND NOT keyword_set(endpoints) THEN BEGIN
627        if n_elements(ex) NE 0 then $
628          if (where(tag_names(ex) EQ 'YTICKNAME'))[0] NE -1 then $
629          ex.YTICKNAME = replicate(' ', n_elements(ex.YTICKNAME))
630        axis, yaxis = 1, ystyle = 1, yticklen = 0 $
631          , ytickname = replicate(' ', !y.ticks+1), _extra = ex
632      ENDIF
633      IF (type EQ 'yt' OR type EQ 'zt') AND NOT keyword_set(endpoints) THEN BEGIN
634        if n_elements(ex) NE 0 then $
635          if (where(tag_names(ex) EQ 'XTICKNAME'))[0] NE -1 then $
636          ex.XTICKNAME = replicate(' ', n_elements(ex.XTICKNAME))
637       axis, xaxis = 1, xstyle = 1, xticklen = 0 $
638        , xtickname = replicate(' ', !x.ticks+1), _extra = ex
639      ENDIF
640; ajout d'un axe ds le cas ou l'on utilise endpoints
641      if keyword_set(endpoints) then addaxe, endpoints, type, posfenetre, _EXTRA = ex
642;------------------------------------------------------------
643; barre de couleur
644;------------------------------------------------------------
645      colnumb = colnumb[0:ncontour-1-keyword_set(strictfill)]
646      barrecouleur, colnumb, min,  max, (ncontour-keyword_set(strictfill))/2 $
647                    , position = posbar, _extra = ex
648;------------------------------------------------------------
649   endif
650;------------------------------------------------------------
651; 1d
652;------------------------------------------------------------
653trace1d:
654   if (typdes eq '1d') then begin
655      if (not keyword_set(col1d)) then col1d = 0
656      if keyword_set(sty1d) then BEGIN ;si on veut faire des barres
657         IF strlowcase(strtrim(sty1d)) EQ 'bar' then begin
658            !y.range = [!y.range[0]-(!y.range[1]-!y.range[0])*.05,!y.range[1]]
659            bar_plot, yy, background = (!d.n_colors-1) < 255,  $
660             baselines = replicate(!y.range[0], n_elements(yy)), barnames = ['', ''], $
661             colors    = replicate(col1d, n_elements(yy)), /outline
662            if n_elements(ex) NE 0 then BEGIN
663; pour avoir un cadre de la couleur noire
664              if (where(tag_names(ex) EQ 'COLOR'))[0] NE -1 then ex.COLOR = 0
665            ENDIF
666            plot, [0], [0], /nodata, /noerase, _extra = ex
667            GOTO, fini
668         ENDIF
669      ENDIF
670      if NOT keyword_set(ov1d) then BEGIN
671         !y.range=[min-abs(max-min)/50.,max+abs(max-min)/50.]
672         legende,mi,ma,type, DIREC = direc, _extra = ex
673;
674         if keyword_set(exchange_xy) then begin
675            rien = !x
676            !x = !y
677            !y = rien
678            rien = xx
679            xx = yy
680            yy = rien
681         endif
682         plot, xx, yy, color = col1d, linestyle = sty1d, thick = 2 $
683           , title = '', subtitle = '', _extra = ex
684; draw 0 line
685         if keyword_set(exchange_xy) then $
686           oplot, [0, 0], !y.range ELSE oplot, !x.range, [0, 0]
687; we want to draw the axis with the time axis length = 1. if we simply
688; use xstyle=1 then each axis (up and down) have majorticks with a
689; length of 1 (-> not very nice when xgridstyle=2), same if
690; xticklen=0.5 (not very nice in the middle).
691; => so we draw the top axis by hand using axis.
692         if n_elements(ex) NE 0 then BEGIN
693; pour avoir un cadre de la couleur noire
694            if (where(tag_names(ex) EQ 'COLOR'))[0] NE -1 then ex.COLOR = 0
695         ENDIF
696         plot, [0], [0], /nodata, /noerase $
697           , xstyle = 1+8*(1-keyword_set(exchange_xy)) $
698           , ystyle = 1+8*keyword_set(exchange_xy), _extra = ex
699; call axis for the missing axis.
700         if n_elements(ex) NE 0 then BEGIN
701; force tickname to blank array
702            if (where(tag_names(ex) EQ 'YTICKNAME'))[0] NE -1 AND keyword_set(exchange_xy) then ex.YTICKNAME = replicate(' ', n_elements(ex.YTICKNAME))
703            if (where(tag_names(ex) EQ 'XTICKNAME'))[0] NE -1 AND NOT keyword_set(exchange_xy) then ex.XTICKNAME = replicate(' ', n_elements(ex.XTICKNAME))
704         ENDIF
705         if keyword_set(exchange_xy) then  axis, yaxis = 1, ystyle = 1 $
706           , yticklen = 0, ytickname = replicate(' ', !y.ticks+1), _extra = ex $
707         ELSE axis, xaxis = 1, xstyle = 1, xticklen = 0 $
708           , xtickname = replicate(' ', !x.ticks+1), _extra = ex
709       ENDIF ELSE oplot, xx, yy, color = col1d, linestyle = sty1d, thick = 2, _extra = ex
710   endif
711fini:
712;------------------------------------------------------------
713; on remet l''axe du temps en jours julien IDL et non pas en jours
714; juliens comptes a partir tempsmin
715;------------------------------------------------------------
716   if type EQ 'xt' then BEGIN
717      !y.range=!y.range+tempsmin
718      !y.tickv=!y.tickv+tempsmin
719   ENDIF ELSE BEGIN
720      !x.range=!x.range+tempsmin
721      !x.tickv=!x.tickv+tempsmin
722   ENDELSE
723; on fait un faut plot pour que ces valeurs soient prises en
724; consideration
725   plot, [0], [0], /nodata, /noerase, xstyle = 5, ystyle = 5 $
726     , title = '', subtitle = '', ytitle = '', xtitle = ''
727;------------------------------------------------------------
728;------------------------------------------------------------
729; 3eme partie: impression eventuelle
730;------------------------------------------------------------
731;------------------------------------------------------------
732   terminedessin, _extra = ex
733   if keyword_set(savedbox) THEN restoreboxparam, 'boxparam4pltt.dat'
734;------------------------------------------------------------
735   if n_elements(key_performance) NE 0 then $
736    IF key_performance EQ 1 THEN print, 'temps pltt', systime(1)-tempsun
737;------------------------------------------------------------
738;------------------------------------------------------------
739;------------------------------------------------------------
740   return
741end
742
743
Note: See TracBrowser for help on using the repository browser.