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

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

debug xxx and cie + clean data file + rm perldoc_idl

  • 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@cm_4mesh
309@cm_4data
310@cm_4cal
311  IF NOT keyword_set(key_forgetold) THEN BEGIN
312@updatenew
313@updatekwd
314  ENDIF
315;--------------------------------------------------------------
316;------------------------------------------------------------
317   tempsun = systime(1)         ; pour key_performance
318;--------------------------------------------------------------
319; I2) reinitialisation. !p.,!x.,!y.
320; Rq: on ne reinitialise pas qd on rapelle plt en boucle pour utiliser contour
321;--------------------------------------------------------------
322   if n_elements(contour) ne 4 AND NOT keyword_set(overplot) $
323    AND NOT keyword_set(ov1d) then reinitplt
324;--------------------------------------------------------------
325; I1) lecture du champ
326;--------------------------------------------------------------
327   if (keyword_set(boxzoom) OR keyword_set(endpoints)) $
328     AND n_elements(contour) ne 4 THEN BEGIN
329     savedbox = 1b
330     saveboxparam, 'boxparam4pltt.dat'
331   ENDIF
332   if n_elements(giventype) NE 0 then type = giventype
333   if n_elements(givenmin) NE 0 then min = givenmin
334   if n_elements(givenmax) NE 0 then max = givenmax
335   if n_elements(minin) NE 0 then min = minin
336   if n_elements(maxin) NE 0 then max = maxin
337   if keyword_set(typein) then BEGIN
338      if size(type, /type) NE 7 AND size(type, /type) NE 0 then begin
339         if n_elements(min) NE 0 then max = min
340         min = type
341      endif
342      type = typein
343    ENDIF
344;
345   checktypeminmax, 'pltt', TYPE = type, MIN = min, MAX = max $
346     , XT = XT, YT = YT, ZT = zt, TT = tt, ENDPOINTS = endpoints, _extra = ex
347;
348   if keyword_set(endpoints) then begin
349      section, tab, z2d, glam, gphi, ENDPOINTS = endpoints, TYPE = type $
350        , BOXZOOM = boxzoom, DIREC = direc
351      nx = n_elements(glam)
352      ny = nx
353      if strupcase(vargrid) EQ 'W' then begin
354         z = gdepw[firstzw:lastzw]
355         nz = nzw
356      ENDIF ELSE BEGIN
357         z = gdept[firstzt:lastzt]
358         nz = nzt
359      ENDELSE
360   ENDIF ELSE BEGIN
361      z2d = checkfield(tab, 'pltt', TYPE = type, BOXZOOM = boxzoom $
362                       , direc = direc, _extra = ex)
363      if z2d[0] EQ -1 then BEGIN
364        IF keyword_set(savedbox) THEN restoreboxparam, 'boxparam4pltt.dat'
365        return
366      endif
367      grille, mask, glam, gphi, gdep, nx, ny,nz
368   ENDELSE
369;---------------------------------------------------------------
370; calcul de tendance/anomaly suivant TREND_TYPE
371;---------------------------------------------------------------
372
373   IF NOT keyword_set(trend_type) THEN trend_type = 0
374
375   IF trend_type GT 0 THEN z2d = trends(z2d, trend_type, type)
376
377;---------------------------------------------------------------
378; filtrage des donnee dans le cas 't'
379;---------------------------------------------------------------
380
381   IF type EQ 't' AND keyword_set(filter) THEN BEGIN
382      print, '    Applying a running mean filter of width '+string(filter, format = '(I3)')
383      z2d = smooth(z2d, filter)
384      z2d[0:filter/2-1] = 0.
385      z2d[(size(z2d))[1]-filter/2-1:(size(z2d))[1]-1] = 0.
386   ENDIF
387
388;---------------------------------------------------------------
389; repetition de la serie temporelle
390;---------------------------------------------------------------
391
392   IF NOT keyword_set(repeat_c) THEN repeat_c = 1
393
394   temps = time[0:jpt-1]
395   IF repeat_c GT 1 THEN BEGIN
396      taille=size(z2d)
397      CASE taille[0] OF
398         1: z2d = reform(z2d#replicate(1, repeat_c), taille[1]*repeat_c)
399         2: BEGIN
400            z2d = z2d[*]#replicate(1, repeat_c)
401            z2d = reform(z2d, taille[1], taille[2]*repeat_c, /over)
402         END
403         ELSE:
404      ENDCASE
405      temps = [temps, (lindgen(jpt*(REPEAT_c-1))+1)*(temps[1]-temps[0])+temps[jpt-1]]
406   ENDIF
407
408;---------------------------------------------------------------
409; selection du type de graphique.
410;---------------------------------------------------------------
411   taille=size(z2d)
412   case taille[0] of
413      2 : typdes='2d'
414      1 : begin
415         z1d=z2d
416         typdes='1d'
417         if keyword_set(OV1D) then begin
418            yy = z2d
419            if n_elements(datmin) NE 0 then tempsmin = date2jul(datmin) $
420            ELSE tempsmin = temps[0]
421; on shift l''axe du temps pour des questions de precision sur les
422; dates du calendier julien en long qui sont passes en float ds les axes
423            xx = temps-tempsmin
424            !x.range=!x.range-tempsmin
425            !x.tickv=!x.tickv-tempsmin
426; on fait un faux plot pour appliquer ces changements!
427            plot,[0], [0],/noerase,xstyle=5, ystyle = 5, title = '', subtitle = '', ytitle = '', xtitle = ''
428            goto, trace1d
429         endif
430      end
431   endcase
432; on construit le mask pour cela le tableau doit etre masque (fait
433; automatiquement a la valeur valmask si on passe ds moyenne ou grossemoyenne)
434   nan = total(finite(z2d,/nan)) < 1
435   if n_elements(valmask) EQ 0 then valmask = 1e20
436   if keyword_set(nan) then begin
437      notanum = where(finite(z2d) EQ 0)
438      z2d[notanum] = 0.
439      mask = z2d LT valmask/10.
440      z2d[notanum] = !values.f_nan
441   ENDIF ELSE mask = z2d LT valmask/10.
442;----------------------------------------------------------------------------
443;   determination du mi:min et du ma:max de z2d ainsi que de max: max et
444;    min: min pour le dessin.
445;-----------------------------------------------------------------------------
446; faudra-t-il faire un autoscale ???
447   autoscale = testvar(var = min) EQ testvar(var = max) AND NOT keyword_set(intervalle)
448   determineminmax, z2d, mask, mi, ma, MININ = min, MAXIN = max, nan = nan, INTERVALLE = intervalle, _extra = ex
449   if z2d[0] EQ -1 THEN return
450; on fait un autoscale si besoin
451   if autoscale then autoscale, min, max, intervalle
452;-----------------------------------------------------------------------------
453;-----------------------------------------------------------------------------
454   if n_elements(contour) ne 4  AND NOT keyword_set(overplot) THEN $
455    placedessin, 'pltt',posfenetre, posbar, contour = contour, direc = direc, type = type, endpoints = endpoints, _extra = ex
456;--------------------------------------------------------------
457;--------------------------------------------------------------
458; 2eme partie: dessin
459;--------------------------------------------------------------
460;-----------------------------------------------------------
461;   definition des axes
462;----------------------------------------------------------
463;-----------------------------------------------------------------------------
464; definition des vecteurs abscisse et ordonee
465; la triangulation est definie pour que le trace soit effectue du bas
466; a gauche vers le haut a droite. il faut donc la matrice e contourer
467; se presente de cette maniere, d''ou certains transpose et reverse
468;-----------------------------------------------------------------------------
469;-----------------------------------------------------------------------------
470; definition des bornes de l''axe temporel
471;-----------------------------------------------------------------------------
472   case N_PARAMS() OF
473      5 : begin
474         tempsmin = date2jul(datmin)
475         tempsmax = temps[(jpt*repeat_c)-1]
476      end
477      6 : begin
478         tempsmin = date2jul(datmin)
479         tempsmax = date2jul(datmax)
480      end
481      else : begin
482         tempsmin = temps[0]
483         tempsmax = temps[(jpt*repeat_c)-1]
484      end
485   endcase
486;-----------------------------------------------------------------------------
487; on shift l''axe du temps pour des questions de precision sur les
488; dates du calendier julien en long qui sont passes en float ds les axes
489   case typdes of
490      '1d' : begin
491         yy = z1d
492         xx = temps-tempsmin
493      end
494      '2d' : begin
495         case 1 of
496            type eq 'xt' : BEGIN
497               xx = glam[*, 0]
498               yy = temps-tempsmin
499            end
500            type eq 'yt' : begin
501               IF (size(gphi))[0] EQ 1 then yy = gphi ELSE BEGIN
502                 IF keyword_set(key_irregular) THEN BEGIN
503                   cln = (where(gphi EQ max(gphi)))[0]
504                   yy = reform(gphi[cln MOD nx, *])
505                 ENDIF ELSE yy = reform(gphi[0, *])
506               ENDELSE
507               xx = temps-tempsmin
508               z2d = transpose(z2d)
509               mask = transpose(mask)
510            end
511            type eq 'zt' : begin
512               yy =  gdep
513               xx = temps-tempsmin
514               z2d = transpose(z2d)
515               mask = transpose(mask)
516            end
517         endcase
518      end
519   endcase
520;--------------------------------------------------------------
521   if NOT keyword_set(overplot) THEN axe, type, tempsmin, tempsmax, _EXTRA = ex ELSE BEGIN
522      if type EQ 'xt' then BEGIN
523         !y.range=!y.range-tempsmin
524         !y.tickv=!y.tickv-tempsmin
525      ENDIF ELSE BEGIN
526         !x.range=!x.range-tempsmin
527         !x.tickv=!x.tickv-tempsmin
528      ENDELSE
529   ENDELSE
530;------------------------------------------------------------
531;------------------------------------------------------------
532; dessin
533;------------------------------------------------------------
534; 2d
535;------------------------------------------------------------
536   if (typdes eq '2d') then begin
537;--------------------------------------------------------------
538; choix des labels
539;-----------------------------------------------------------
540      if keyword_set(intervalle) AND NOT keyword_set(label) then label=1
541      if keyword_set(label) eq 0 then cas=0 else cas=label
542      label, cas, min, max, ncontour, level_z2d, colnumb, NLEVEL = nlevel $
543             , INTERVALLE = intervalle, strictfill = strictfill
544;--------------------------------------------------------------
545; choix de style
546;-----------------------------------------------------------
547      if not keyword_set(style) then style=0
548      style,style,level_z2d,linestyle,thick
549      if keyword_set(inv) then colnumb=reverse(colnumb)
550;----------------------------------------------------------------------
551      nby = n_elements(yy)
552      nbx = n_elements(xx)
553;
554      if keyword_set(nan) then BEGIN
555;         xx = xx#replicate(1, nby) ; on passe les axes en tableaux 2d
556;         yy = replicate(1, nbx)#yy
557         masknan = finite(z2d)
558         z2d[where(masknan EQ 0)] = max
559         mask = temporary(mask)*temporary(masknan)
560      ENDIF
561      z2d = remplit(z2d,nite=2+keyword_set(nan), mask = mask, /basique, _extra=ex)
562      if NOT keyword_set(strictfill) then z2d = min > z2d <  max
563      if keyword_set(nan) then $
564       triangulation = triangule(mask,/basic,coinmonte=coinmontemask $
565                                 ,coindescend=coindescendmask) $
566       ELSE triangulation = -1
567;----------------------------------------------------------------------
568      pltbase,z2d, xx, yy, mask,xx, yy, level_z2d,colnumb, contour = contour,/noerase $
569       , c_linestyle=linestyle,c_labels=1-(indgen(n_elements(level_z2d)) MOD 2) $
570       , trichamp = triangulation, trimsk = triangulation, overplot = overplot $
571       , c_thick=thick, performance = key_performance, usetri = keyword_set(nan) $
572       , coinmontemask=coinmontemask, coindescendmask=coindescendmask, _extra = ex
573;------------------------------------------------------------
574      if n_elements(contour) eq 4 then BEGIN ; c''est la 2eme fois que je passe ds pltt
575         contour = {mietma:[mi, ma], unit:varunit, inter:intervalle} ; je renvoie le min, le max et l''unite
576         return
577      endif
578;------------------------------------------------------------
579      if keyword_set(contour) then BEGIN
580         pourlegende = [1, 1, 1, 1]
581         oldattributs = saveatt()
582         oldcolnumb = colnumb
583         pltt,contour,type, contmin,contmax,CONTOUR=pourlegende, /noerase, USETRI = usetri $
584          ,INTERVALLE=contintervalle,LABEL=contlabel,STYLE=style, ENDPOINTS = endpoints $
585           , NLEVEL = contnlevel, BOXZOOM = boxzoom, STRICTFILL = strictfill, _extra = ex
586         colnumb = oldcolnumb
587         restoreatt, oldattributs
588      endif
589;----------------------------------------------------------------------
590;----------------------------------------------------------------------
591      if keyword_set(overplot) then GOTO, fini
592;------------------------------------------------------------
593; Trace de la ligne de changement de date or the equator
594;------------------------------------------------------------
595      IF key_onearth THEN BEGIN
596        CASE type OF
597          'xt':oplot, [180, 180] - 360*(!x.range[1] LT 180), !y.range
598          'yt':oplot, !x.range, [0, 0]
599          ELSE:
600        ENDCASE
601      ENDIF
602;------------------------------------------------------------
603; legendes + affichage de celles-ci
604;------------------------------------------------------------
605      legende,mi,ma,type, CONTOUR = pourlegende, DIREC = direc, INTERVALLE = intervalle $
606       , ENDPOINTS = endpoints, _extra = ex
607;
608; we want to draw the time axis with tick length = 1. if we simply
609; use [xy]style=1 then each axis (up and down or left and right) have
610; majorticks with a length of 1 (-> not very nice when xgridstyle=2),
611; same if xticklen=0.5 (not very nice in the middle). => so we draw
612; the top (right) axis by hand using axis.
613;
614      if n_elements(ex) NE 0 then BEGIN
615; pour avoir un cadre de la couleur noire
616        if (where(tag_names(ex) EQ 'COLOR'))[0] NE -1 then ex.COLOR = 0
617      ENDIF
618;
619      plot, [0], [0], /nodata, /noerase, _extra = ex $
620        , xstyle = 1+4*(keyword_set(endpoints) AND type EQ 'xt' AND lat1 NE lat2)+8*(type EQ 'yt' OR type EQ 'zt') $
621        , ystyle = 1+4*(keyword_set(endpoints) AND type EQ 'yt')+8*(type EQ 'xt')
622; call axis for the missing axis.
623      IF type EQ 'xt' AND NOT keyword_set(endpoints) THEN BEGIN
624        if n_elements(ex) NE 0 then $
625          if (where(tag_names(ex) EQ 'YTICKNAME'))[0] NE -1 then $
626          ex.YTICKNAME = replicate(' ', n_elements(ex.YTICKNAME))
627        axis, yaxis = 1, ystyle = 1, yticklen = 0 $
628          , ytickname = replicate(' ', !y.ticks+1), _extra = ex
629      ENDIF
630      IF (type EQ 'yt' OR type EQ 'zt') AND NOT keyword_set(endpoints) THEN BEGIN
631        if n_elements(ex) NE 0 then $
632          if (where(tag_names(ex) EQ 'XTICKNAME'))[0] NE -1 then $
633          ex.XTICKNAME = replicate(' ', n_elements(ex.XTICKNAME))
634       axis, xaxis = 1, xstyle = 1, xticklen = 0 $
635        , xtickname = replicate(' ', !x.ticks+1), _extra = ex
636      ENDIF
637; ajout d'un axe ds le cas ou l'on utilise endpoints
638      if keyword_set(endpoints) then addaxe, endpoints, type, posfenetre, _EXTRA = ex
639;------------------------------------------------------------
640; barre de couleur
641;------------------------------------------------------------
642      colnumb = colnumb[0:ncontour-1-keyword_set(strictfill)]
643      barrecouleur, colnumb, min,  max, (ncontour-keyword_set(strictfill))/2 $
644                    , position = posbar, _extra = ex
645;------------------------------------------------------------
646   endif
647;------------------------------------------------------------
648; 1d
649;------------------------------------------------------------
650trace1d:
651   if (typdes eq '1d') then begin
652      if (not keyword_set(col1d)) then col1d = 0
653      if keyword_set(sty1d) then BEGIN ;si on veut faire des barres
654         IF strlowcase(strtrim(sty1d)) EQ 'bar' then begin
655            !y.range = [!y.range[0]-(!y.range[1]-!y.range[0])*.05,!y.range[1]]
656            bar_plot, yy, background = (!d.n_colors-1) < 255,  $
657             baselines = replicate(!y.range[0], n_elements(yy)), barnames = ['', ''], $
658             colors    = replicate(col1d, n_elements(yy)), /outline
659            if n_elements(ex) NE 0 then BEGIN
660; pour avoir un cadre de la couleur noire
661              if (where(tag_names(ex) EQ 'COLOR'))[0] NE -1 then ex.COLOR = 0
662            ENDIF
663            plot, [0], [0], /nodata, /noerase, _extra = ex
664            GOTO, fini
665         ENDIF
666      ENDIF
667      if NOT keyword_set(ov1d) then BEGIN
668         !y.range=[min-abs(max-min)/50.,max+abs(max-min)/50.]
669         legende,mi,ma,type, DIREC = direc, _extra = ex
670;
671         if keyword_set(exchange_xy) then begin
672            rien = !x
673            !x = !y
674            !y = rien
675            rien = xx
676            xx = yy
677            yy = rien
678         endif
679         plot, xx, yy, color = col1d, linestyle = sty1d, thick = 2 $
680           , title = '', subtitle = '', _extra = ex
681; draw 0 line
682         if keyword_set(exchange_xy) then $
683           oplot, [0, 0], !y.range ELSE oplot, !x.range, [0, 0]
684; we want to draw the axis with the time axis length = 1. if we simply
685; use xstyle=1 then each axis (up and down) have majorticks with a
686; length of 1 (-> not very nice when xgridstyle=2), same if
687; xticklen=0.5 (not very nice in the middle).
688; => so we draw the top axis by hand using axis.
689         if n_elements(ex) NE 0 then BEGIN
690; pour avoir un cadre de la couleur noire
691            if (where(tag_names(ex) EQ 'COLOR'))[0] NE -1 then ex.COLOR = 0
692         ENDIF
693         plot, [0], [0], /nodata, /noerase $
694           , xstyle = 1+8*(1-keyword_set(exchange_xy)) $
695           , ystyle = 1+8*keyword_set(exchange_xy), _extra = ex
696; call axis for the missing axis.
697         if n_elements(ex) NE 0 then BEGIN
698; force tickname to blank array
699            if (where(tag_names(ex) EQ 'YTICKNAME'))[0] NE -1 AND keyword_set(exchange_xy) then ex.YTICKNAME = replicate(' ', n_elements(ex.YTICKNAME))
700            if (where(tag_names(ex) EQ 'XTICKNAME'))[0] NE -1 AND NOT keyword_set(exchange_xy) then ex.XTICKNAME = replicate(' ', n_elements(ex.XTICKNAME))
701         ENDIF
702         if keyword_set(exchange_xy) then  axis, yaxis = 1, ystyle = 1 $
703           , yticklen = 0, ytickname = replicate(' ', !y.ticks+1), _extra = ex $
704         ELSE axis, xaxis = 1, xstyle = 1, xticklen = 0 $
705           , xtickname = replicate(' ', !x.ticks+1), _extra = ex
706       ENDIF ELSE oplot, xx, yy, color = col1d, linestyle = sty1d, thick = 2, _extra = ex
707   endif
708fini:
709;------------------------------------------------------------
710; on remet l''axe du temps en jours julien IDL et non pas en jours
711; juliens comptes a partir tempsmin
712;------------------------------------------------------------
713   if type EQ 'xt' then BEGIN
714      !y.range=!y.range+tempsmin
715      !y.tickv=!y.tickv+tempsmin
716   ENDIF ELSE BEGIN
717      !x.range=!x.range+tempsmin
718      !x.tickv=!x.tickv+tempsmin
719   ENDELSE
720; on fait un faut plot pour que ces valeurs soient prises en
721; consideration
722   plot, [0], [0], /nodata, /noerase, xstyle = 5, ystyle = 5 $
723     , title = '', subtitle = '', ytitle = '', xtitle = ''
724;------------------------------------------------------------
725;------------------------------------------------------------
726; 3eme partie: impression eventuelle
727;------------------------------------------------------------
728;------------------------------------------------------------
729   terminedessin, _extra = ex
730   if keyword_set(savedbox) THEN restoreboxparam, 'boxparam4pltt.dat'
731;------------------------------------------------------------
732   if n_elements(key_performance) NE 0 then $
733    IF key_performance EQ 1 THEN print, 'temps pltt', systime(1)-tempsun
734;------------------------------------------------------------
735;------------------------------------------------------------
736;------------------------------------------------------------
737   return
738end
739
740
Note: See TracBrowser for help on using the repository browser.