source: trunk/PLOTS/DESSINE/plt1d.pro @ 2

Last change on this file since 2 was 2, checked in by opalod, 22 years ago

Initial revision

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 15.3 KB
Line 
1;------------------------------------------------------------
2;+
3; NAME:
4;       PLT1D
5;
6; PURPOSE:
7;       trace des graphes 1d
8;
9; CATEGORY:
10;       Graphics, trace des graphes 1d: x,y,z (ou t mais ds ce cas, on
11;       rapelle directement pltt)
12;
13; CALLING SEQUENCE:
14;       plt1d, champ,type [,min[, max]]
15;
16; INPUTS:
17;       champ: le champ dont on veut faire le hovmoller champ
18;       peut etre de 2 types:
19;       1) un tableu qui peut etre:
20;          * 2d, 3d ou 4d:  tableau xy, xyz. xyt ou xyzt. dans ce cas,
21;            le tableau va passer dans moyenne ou grossemoyenne pour
22;            etre moyennee et devenir un tableau 1 1d.
23;          * 1d:type doit qd meme etre specifie pour qu''on sache de
24;          quel trace il sagit. Pour avoir une legende correcte,
25;          respecifier la zone d''extraction via BOITE
26;       2) une structure repondant aux critaires specifies par
27;       litchamp.pro. cf. IDL> xhelp,'litchamp'. Le tableau contennu ds
28;       la structure repondant aux criteres du cas 1) cf. ci-dessus
29;
30;       TYPE: un string: type de plot 1d que l''on veut faire:
31;       trace suivant: 'x','y','z' 
32;
33; ces arguments ne sont pas obligatoires:
34
35;       MAX: valeur maximum que l'on veut prendre en compte dans le trace
36; du plot. Par defaut on prend le max de tableau (sur les pts mer)
37;
38;       MIN: valeur minimum que l'on veut prendre en compte dans le trace
39; du plot. Par defaut on prend le min de tableau (sur les pts mer)
40;
41; KEYWORD PARAMETERS:
42;
43;       BOITE:vecteur indiquant la zone geographique (3d) sur laquelle doit
44; etre fait l''extraction du champ pour faire le hovmoeller.
45; Si BOITE a :
46; 1 element : l''extraction est faite sur [lon1, lon2, lat1, lat2, 0.,boite[0]]
47; 2 elements: l''extraction est faite sur [lon1, lon2, lat1, lat2, boite[0],boite[1]]
48; 4 elements: l''extraction est faite sur [Boite, prof1, prof2]
49; 5 elements: l''extraction est faite sur [Boite[0:3], 0, Boite[4]]
50; 6 elements: l''extraction est faite sur Boite
51;
52; Ou lon1, lon2,lat1,lat2,prof1,prof2 sont les variables globales
53; definies lors du dernier domdef!
54;
55;       COL1d: --OBSOLETE--numero de la couleur qd on fait un trace 1d
56;       par defaut, 0. il faut mieux utiliser le mot cle COLOR utilise
57;       par plot
58;
59;       ENDPOINTS: mot clef specifiant que l'on veut faire une coupe
60;       verticale en diagonale. les coordonnees des extremites de
61;       celle-ci sont alors definies les 4 elements du vecteur
62;       ENDPOINTS: [x1,y1,x2,y2] qui sont les coordonnees
63;
64;       /LANDSCAPE: oblige la feuille ou le fenetre a l''ecran a etre
65;       en position "allongee".
66;       
67;       MAXIN: permet de specifier la valeur maximum que l''on veut
68;       prendre en compte dans le trace des contours a l''aide d''un
69;       mot cle plutot que par l''argument max. Si l''argument et le
70;       mot cle sont specifies en meme temps, c''est la valeur
71;       specifiee par le mot cle qui est retenue.
72;
73;       MININ: permet de specifier la valeur minimum que l''on veut
74;       prendre en compte dans le trace des contours a l''aide d''un
75;       mot cle plutot que par l''argument min. Si l''argument et le
76;       mot cle sont specifies en meme temps, c''est la valeur
77;       specifiee par le mot cle qui est retenue.
78;
79;       /NOERASE: activer pour faire un dessin a l''ecran sans creer
80; une nouvelle fenetre. Rq: activer ds le cas d''un Postscript de
81; plusieurs traces de type 't' pour ne pas faire un Postscript de
82; plusieurs pages
83;
84;       /OV1D:permet de surimprimer un courbe 1d a un precedent trace 1d.
85;
86;       PETITDESSIN: vecteur de 3 ou 4 elements, applique pour faire un
87; dessin sur une petite portion de feuille ou d''ecran. il delimite
88; la zone ds laquelle va etre fait le dessin
89; si il a 4 elements:
90;       il est alors constitute des coordonnees -exprime en cm reperes par
91;       rapport au coin en bas a gauche de la feuille ou de la fenetre
92;       (en portrait comme en landscape)- du coin en bas a
93;       gauche et du coin en haut a droite  de la zone de dessin.
94; si il a 3 elements:
95;       Ds ce cas, on divise la fenetre ou l''ecran en PETITDESSIN[0]
96;       colonnes, en PETITDESSIN[1] lignes le dessin se faisant ds la
97;       case numero PETITDESSIN[2].La numerotation commencant en haut
98;       a gauche par le numero 1 et suivant apres dans le sens de
99;       l''ecriture.
100; Par defaut on fait un dessin occupant la plus grande place possible
101; tout en concervant le rapport d''aspect (sauf qd REMPLI est active)
102;
103;       /PORTRAIT: oblige la feuille ou la fenetre a etre en position "debout".
104;
105;       /POST: faire une sortie postscript. Ne marche que si on fait
106;       un seul dessin sur la feuille. Si on fait plusieurs dessins,
107;       utiliser @ps ou plein2dessins
108;
109;       /REMPLI:oblige le dessin a occuper l'espace maximum definit
110;       par petitdessin
111;
112;       /REVERSE_X: pour inverser l''axe des x (et aussi le dessin)
113;
114;       /REVERSE_Y: pour inverser l''axe des y (et aussi le dessin)
115;
116;       /SIN: activer ce mot cle si l''on veut que l'' axe des x soit
117;       trace en sinus de la latitude qd on fait un frace f(y)
118;
119;       STY1D: --OBSOLETE--numero du style utilise lors d'un trace
120;       1d. Il faut mieux utiliser le mot cle LINESTYLE qui est celui
121;       de plot. Attention ce mot cle est encore utile si on veut
122;       faire des barres plutot qu'un courbe, mettre sty1d='bar'
123;
124;       /TRANS: fait un postscript (active /post automatiquement) et l'imprime
125; -si on le desire- sur un transparant
126;
127;       WINDOW: nimero de la fenetre ou l'on veut faire le graphe (permet
128; d'ouvrir plusieurs fenetres). par defaut on ouvre 'IDL0'
129;
130;       YSURX: rapport d'echelle entre y et x. Par defaut=1
131; Par defaut on adapte pour occupe une grande partie de la feuille en sortie
132; postScript ou pour cree une fenetre pas trop etiree
133;
134; COMMON BLOCKS:
135;       common.pro
136;
137; SIDE EFFECTS:
138;
139; RESTRICTIONS:
140;
141; EXAMPLE:
142;
143; MODIFICATION HISTORY: creation 24/6/99 Eric Guilyardi
144;                       (a partir routine pltt de Sebastien Masson)
145; 8/7/1999 Sebastien Masson (smasson@lodyc.jussieu.fr)
146; inspection des travaux finis
147; 8/2/2000 Sebastien Masson: checkfield
148;-
149;------------------------------------------------------------
150;------------------------------------------------------------
151;------------------------------------------------------------
152pro plt1d,tab,giventype, givenmin,givenmax,BOITE = boite, SIN = sin $
153          , MININ = minin, MAXIN = maxin, TYPEIN = typein,ENDPOINTS=endpoints $
154          ,COL1D=col1d,STY1D=sty1d,OV1D=ov1d, X = x, Y = y, Z = z, TT = tt $
155          , REVERSE_X = reverse_x, REVERSE_Y = reverse_y, _extra = ex
156@common
157;------------------------------------------------------------
158   tempsun = systime(1)         ; pour key_performance
159;--------------------------------------------------------------
160; 1ere partie: initialisation et petits calculs...
161;--------------------------------------------------------------
162;--------------------------------------------------------------
163;--------------------------------------------------------------
164; verification de la valeur de type
165;--------------------------------------------------------------
166   if n_elements(giventype) NE 0 then type = giventype
167   if n_elements(givenmin) NE 0 then min = givenmin
168   if n_elements(givenmax) NE 0 then max = givenmax
169   if n_elements(minin) NE 0 then min = minin
170   if n_elements(maxin) NE 0 then max = maxin
171   if keyword_set(tt) then typein = 't'
172   if keyword_set(typein) then BEGIN
173      if size(type, /type) NE 7 AND size(type, /type) NE 0 then begin
174         if n_elements(min) NE 0 then max = min
175         min = type
176      endif
177      type = typein
178   endif
179   if keyword_set(boite) then BEGIN
180      oldboite = [lon1, lon2, lat1, lat2, prof1, prof2]
181      vraiboite = boite
182   ENDIF
183   checktypeminmax, 'plt1d', TYPE = type, MIN = min, MAX = max, ENDPOINTS=endpoints $
184    , XX = keyword_set(x) , YY = keyword_set(y) , ZZ = keyword_set(z)
185   if type EQ 't' then BEGIN
186      pltt, tab,type, min,max,BOITE = boite, SIN = sin, TYPEIN = typein $
187       ,COL1D=col1d,STY1D=sty1d,OV1D=ov1d, ENDPOINTS=endpoints, _extra = ex
188      return
189   endif
190;--------------------------------------------------------------
191; I2) reinitialisation. !p.,!x.,!y.
192; Rq: on ne reinitialise pas qd on rapelle plt1d
193;--------------------------------------------------------------
194   if NOT keyword_set(ov1d) then reinitplt
195;--------------------------------------------------------------
196; I1) lecture du champ
197;--------------------------------------------------------------
198   if keyword_set(endpoints) then begin
199      section, tab, z1d, glam, gphi, ENDPOINTS = endpoints, TYPE = type, BOITE = boite, DIREC = direc
200      nx = n_elements(glam)
201      ny = nx
202      if strupcase(vargrid) EQ 'W' then begin
203         z = gdepw[premierzw:dernierzw]
204         nz = nzw
205      ENDIF ELSE BEGIN
206         z = gdept[premierzt:dernierzt]
207         nz = nzt
208      ENDELSE
209   ENDIF ELSE BEGIN
210      z1d = checkfield(tab, 'plt1d', TYPE = type, BOITE = boite, direc = direc, _extra = ex)
211      grille, mask, glam, gphi, gdep, nx, ny,nz
212   ENDELSE
213   if z1d[0] EQ -1 then BEGIN
214      if keyword_set(boite) then domdef, oldboite,GRILLE=vargrid
215      return
216   endif
217; on construit le mask pour cela le tableau doit etre masque (fait
218; automatiquement a la valeure valmask si on passe ds moyenne ou grossemoyenne)
219   mask = fltarr(n_elements(z1d))
220   if n_elements(valmask) EQ 0 then valmask = 1e20
221   nan = total(finite(z1d,/nan))  < 1
222   if keyword_set(nan) then begin
223      notanum = where(finite(z1d) EQ 0)
224      z1d[notanum] = 0
225      mask(where(z1d LT valmask/10)) = 1
226      z1d[notanum] = !values.f_nan
227   ENDIF ELSE mask(where(z1d LT valmask/10)) = 1
228;-----------------------------------------------------------------------------
229; determination du min et du max apres la moyenne
230;-----------------------------------------------------------------------------
231   nan = total(finite(z1d,/nan)) < 1
232   determineminmax, z1d, mask, mi, ma, MININ = min, MAXIN = max, nan = nan, INTERVALLE = intervalle
233   if z1d[0] EQ -1 THEN return
234;-----------------------------------------------------------------------------
235;-----------------------------------------------------------------------------
236   if NOT keyword_set(ov1d) THEN placedessin, 'autre', posfenetre, posbar, contour = contour, DIREC = direc, endpoints = endpoints, _extra = ex
237;--------------------------------------------------------------
238;--------------------------------------------------------------
239; 2eme partie: dessin
240;--------------------------------------------------------------
241;-----------------------------------------------------------------------------
242; definition des vecteurs abscisse et ordonee
243; la triangulation est definie pour que le trace soit effectue du bas
244; a gauche vers le haut a droite. il faut donc la matrice e contourer
245; se presente de cette maniere, d''ou certains transpose et reverse
246;-----------------------------------------------------------------------------
247;-----------------------------------------------------------------------------
248   case type of
249      'y': begin
250         yy = z1d
251         if (size(gphi))[0] EQ 1 then xx = gphi ELSE xx = reform(gphi[0, *])
252         if keyword_set(sin) then xx = sin(!pi/180.*xx)
253         min0 = lat1 & max0 = lat2
254      END
255      'x':begin
256         yy = z1d
257         xx = glam[*, 0]
258         min0 = lon1 & max0 = lon2
259      END
260      'z':begin
261         yy = reverse(gdep, 1)
262         xx = reverse(z1d, 1)
263         min0 = 0 & max0 = 0
264         case n_elements(vraiboite) of
265            0:!y.range=[prof1, prof2]
266            1:!y.range=[0, vraiboite]
267            2:!y.range=vraiboite
268            4:!y.range=[prof1, prof2]
269            5:!y.range=[0, vraiboite[4]]
270            6:!y.range=vraiboite[4:5]
271         endcase
272         if NOT keyword_set(ov1d) then !y.range = reverse(!y.range)
273      END
274   ENDCASE
275;-----------------------------------------------------------
276;-----------------------------------------------------------
277;   definition des axes
278;----------------------------------------------------------
279;    if keyword_set(integrationtps) then axe, type, time[0], time[jpt-1], SIN = sin, _extra = ex $
280;    ELSE axe, type, SIN = sin
281   if NOT keyword_set(ov1d) then axe, type, SIN = sin
282;------------------------------------------------------------
283;------------------------------------------------------------
284; dessin
285;------------------------------------------------------------
286;------------------------------------------------------------
287   if type EQ 'z' then begin
288      idx = where(xx NE valmask)
289      if NOT keyword_set(ov1d) then BEGIN
290         if min EQ mi then !x.range=[min-abs(max-min)/5.,max+abs(max-min)/5.] $
291         ELSE !x.range=[min, max]
292      ENDIF
293   ENDIF ELSE BEGIN
294      idx = where(yy NE valmask)
295      if NOT keyword_set(ov1d) then BEGIN
296         if min EQ mi then !y.range=[min-abs(max-min)/5.,max+abs(max-min)/5.] $
297         ELSE !y.range=[min, max]
298      ENDIF
299   ENDELSE
300;
301   if NOT keyword_set(ov1d) then BEGIN
302      if keyword_set(reverse_x) then !x.range=reverse(!x.range)
303      if keyword_set(reverse_y) then !y.range=reverse(!y.range)
304   ENDIF
305;
306   xx = xx[idx]
307   yy = yy[idx]
308   if (not keyword_set(col1d)) then col1d = 0
309   if keyword_set(sty1d) then BEGIN ;si on veut faire des barres
310      IF strlowcase(strtrim(sty1d)) EQ 'bar' then begin
311         !y.range = [!y.range[0]-(!y.range[1]-!y.range[0])*.05,!y.range[1]]
312         bar_plot, yy, background = (!d.n_colors-1) < 255,  $
313          baselines = replicate(!y.range[0], n_elements(yy)), barnames = ['', ''], $
314          colors    = replicate(col1d      , n_elements(yy)), /outline
315         plot, [0], [0],/noerase,color=c_cote, _extra = ex
316         GOTO, fini
317      ENDIF
318   ENDIF
319   if NOT keyword_set(ov1d) then BEGIN
320      legende,mi,ma,type, CONTOUR = contour, DIREC = direc, ENDPOINTS = endpoints, _EXTRA = ex
321;
322      plot,xx,yy,color=col1d,linestyle=sty1d,thick=2, title = '', subtitle = '',_extra = ex
323      if n_elements(ex) NE 0 then BEGIN
324; pour avoir un cadre de la couleur c_cote et trace une ligne a y=0
325         if (where(tag_names(ex) EQ 'COLOR'))[0] NE -1 then ex.COLOR = c_cote
326         if (where(tag_names(ex) EQ 'LINESTYLE'))[0] NE -1 then ex.LINESTYLE= 0
327         if (where(tag_names(ex) EQ 'THICK'))[0] NE -1 then ex.THICK= 0
328      ENDIF
329      plot, !x.range, [0, 0],/noerase,color=c_cote $
330       , xstyle = 1+4*(keyword_set(endpoints) AND $
331                       ((type EQ 'x' AND lat1 NE lat2) OR (type EQ 'y' AND lon1 NE lon2))) $
332       , ystyle = 1, _extra = ex
333; ajout d'un axe ds le cas ou l'on utilise endpoints
334      if keyword_set(endpoints) then addaxe, endpoints, type, posfenetre, _EXTRA = ex
335; trace une ligne a x=0
336      plot, [0, 0],!y.range ,/noerase,color=c_cote, title = '', subtitle = '', _extra = ex
337   ENDIF ELSE oplot,xx,yy,color=col1d,linestyle=sty1d,thick=2, _extra = ex
338;------------------------------------------------------------
339;------------------------------------------------------------
340; 3eme partie: impression eventuelle
341;------------------------------------------------------------
342;------------------------------------------------------------
343fini:
344   if keyword_set(oldboite) then domdef, oldboite,GRILLE=[vargrid, 'T']
345   terminedessin, _extra = ex
346   if keyword_set(vraiboite) then boite = vraiboite
347;------------------------------------------------------------
348   if n_elements(key_performance) NE 0 then $
349    IF key_performance EQ 1 THEN print, 'temps plt1d', systime(1)-tempsun
350;------------------------------------------------------------
351;------------------------------------------------------------
352;------------------------------------------------------------
353   return
354end
355
356
Note: See TracBrowser for help on using the repository browser.