source: trunk/SRC/ToBeReviewed/PLOTS/DESSINE/plt1d.pro @ 72

Last change on this file since 72 was 35, checked in by pinsard, 18 years ago

upgrade of PLOTS/DESSINE according to cerbere.lodyc.jussieu.fr: /usr/home/smasson/SAXO_RD/ : files

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 15.9 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 BOXZOOM
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;       BOXZOOM:vecteur indiquant la zone geographique (3d) sur laquelle doit
44; etre fait l''extraction du champ pour faire le hovmoeller.
45; Si BOXZOOM a :
46; 1 element : l''extraction est faite sur [lon1, lon2, lat1, lat2, 0.,boxzoom[0]]
47; 2 elements: l''extraction est faite sur [lon1, lon2, lat1, lat2, boxzoom[0],boxzoom[1]]
48; 4 elements: l''extraction est faite sur [Boxzoom, vert1, vert2]
49; 5 elements: l''extraction est faite sur [Boxzoom[0:3], 0, Boxzoom[4]]
50; 6 elements: l''extraction est faite sur Boxzoom
51;
52; Ou lon1, lon2,lat1,lat2,vert1,vert2 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;       YXASPECT: 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;       /ZEROMIDDLE: fo force the middle of the colorbar to be equal
135;       to 0 (force max=max(abs([min,max])) and min=-max)
136;
137; COMMON BLOCKS:
138;       common.pro
139;
140; SIDE EFFECTS:
141;
142; RESTRICTIONS:
143;
144; EXAMPLE:
145;
146; MODIFICATION HISTORY: creation 24/6/99 Eric Guilyardi
147;                       (a partir routine pltt de Sebastien Masson)
148; 8/7/1999 Sebastien Masson (smasson@lodyc.jussieu.fr)
149; inspection des travaux finis
150; 8/2/2000 Sebastien Masson: checkfield
151;-
152;------------------------------------------------------------
153;------------------------------------------------------------
154;------------------------------------------------------------
155pro plt1d, tab, giventype, givenmin, givenmax, BOXZOOM = boxzoom, SIN = sin $
156           , MININ = minin, MAXIN = maxin, TYPEIN = typein, ENDPOINTS = endpoints $
157           , COL1D = col1d, STY1D = sty1d, OV1D = ov1d, X = x, Y = y, Z = z, TT = tt $
158           , REVERSE_X = reverse_x, REVERSE_Y = reverse_y, SWITCHXY = switchxy $
159           , _extra = ex
160;---------------------------------------------------------
161; include common
162@cm_4mesh
163@cm_4data
164  IF NOT keyword_set(key_forgetold) THEN BEGIN
165@updatenew
166@updatekwd
167  ENDIF
168;------------------------------------------------------------
169  tempsun = systime(1)          ; pour key_performance
170;--------------------------------------------------------------
171; 1ere partie: initialisation et petits calculs...
172;--------------------------------------------------------------
173;--------------------------------------------------------------
174;--------------------------------------------------------------
175; verification de la valeur de type
176;--------------------------------------------------------------
177;
178  if n_elements(giventype) NE 0 then type = giventype
179  if n_elements(givenmin) NE 0 then min = givenmin
180  if n_elements(givenmax) NE 0 then max = givenmax
181  if n_elements(minin) NE 0 then min = minin
182  if n_elements(maxin) NE 0 then max = maxin
183  if keyword_set(tt) then typein = 't'
184  if keyword_set(typein) then BEGIN
185    if size(type, /type) NE 7 AND size(type, /type) NE 0 then begin
186      if n_elements(min) NE 0 then max = min
187      min = type
188    endif
189    type = typein
190  endif
191;
192  checktypeminmax, 'plt1d', TYPE = type, MIN = min, MAX = max, ENDPOINTS = endpoints $
193    , XX = keyword_set(x), YY = keyword_set(y), ZZ = keyword_set(z)
194  if type EQ 't' then BEGIN
195    pltt, tab, type, min, max, BOXZOOM = boxzoom, SIN = sin, TYPEIN = typein $
196      , COL1D = col1d, STY1D = sty1d, OV1D = ov1d, ENDPOINTS = endpoints, _extra = ex
197    return
198  endif
199;--------------------------------------------------------------
200; I2) reinitialisation. !p.,!x.,!y.
201; Rq: on ne reinitialise pas qd on rapelle plt1d
202;--------------------------------------------------------------
203  if NOT keyword_set(ov1d) then reinitplt
204;--------------------------------------------------------------
205; I1) lecture du champ
206;--------------------------------------------------------------
207   if (keyword_set(boxzoom) OR keyword_set(endpoints)) THEN BEGIN
208     savedbox = 1b
209     saveboxparam, 'boxparam4plt1d.dat'
210   ENDIF
211;
212  if keyword_set(endpoints) then begin
213    section, tab, z1d, glam, gphi, ENDPOINTS = endpoints, TYPE = type $
214      , BOXZOOM = boxzoom, DIREC = direc
215    nx = n_elements(glam)
216    ny = nx
217    if strupcase(vargrid) EQ 'W' then begin
218      z = gdepw[firstzw:lastzw]
219      nz = nzw
220    ENDIF ELSE BEGIN
221      z = gdept[firstzt:lastzt]
222      nz = nzt
223    ENDELSE
224  ENDIF ELSE BEGIN
225    z1d = checkfield(tab, 'plt1d', TYPE = type, BOXZOOM = boxzoom $
226                     , direc = direc, _extra = ex)
227    grille, mask, glam, gphi, gdep, nx, ny, nz
228  ENDELSE
229  if z1d[0] EQ -1 then BEGIN
230    IF keyword_set(savedbox) THEN restoreboxparam, 'boxparam4plt1d.dat'
231    return
232  endif
233; on construit le mask pour cela le tableau doit etre masque (fait
234; automatiquement a la valeure valmask si on passe ds moyenne ou grossemoyenne)
235  mask = fltarr(n_elements(z1d))
236  if n_elements(valmask) EQ 0 then valmask = 1e20
237  nan = total(finite(z1d, /nan))  < 1
238  if keyword_set(nan) then begin
239    notanum = where(finite(z1d) EQ 0)
240    z1d[notanum] = 0
241    mask(where(z1d LT valmask/10)) = 1
242    z1d[notanum] = !values.f_nan
243  ENDIF ELSE mask(where(z1d LT valmask/10)) = 1
244;-----------------------------------------------------------------------------
245; determination du min et du max apres la moyenne
246;-----------------------------------------------------------------------------
247  nan = total(finite(z1d, /nan)) < 1
248  determineminmax, z1d, mask, mi, ma, MININ = min, MAXIN = max, nan = nan, INTERVALLE = intervalle, _extra = ex
249  if z1d[0] EQ -1 THEN return
250;-----------------------------------------------------------------------------
251;-----------------------------------------------------------------------------
252  if NOT keyword_set(ov1d) THEN placedessin, 'autre', posfenetre, posbar, contour = contour, DIREC = direc, endpoints = endpoints, _extra = ex
253;--------------------------------------------------------------
254;--------------------------------------------------------------
255; 2eme partie: dessin
256;--------------------------------------------------------------
257;-----------------------------------------------------------------------------
258; definition des vecteurs abscisse et ordonee
259; la triangulation est definie pour que le trace soit effectue du bas
260; a gauche vers le haut a droite. il faut donc la matrice e contourer
261; se presente de cette maniere, d''ou certains transpose et reverse
262;-----------------------------------------------------------------------------
263;-----------------------------------------------------------------------------
264  case type of
265    'y': begin
266      yy = z1d
267      if (size(gphi))[0] EQ 1 then xx = gphi ELSE xx = reform(gphi[0, *])
268      if keyword_set(sin) then xx = sin(!pi/180.*xx)
269      min0 = lat1 & max0 = lat2
270    END
271    'x':begin
272      yy = z1d
273      xx = glam[*, 0]
274      min0 = lon1 & max0 = lon2
275    END
276    'z':begin
277      yy = reverse(gdep, 1)
278      xx = reverse(z1d, 1)
279      min0 = 0 & max0 = 0
280      case n_elements(boxzoom) of
281        0:!y.range = [vert1, vert2]
282        1:!y.range = [0, boxzoom]
283        2:!y.range = boxzoom
284        4:!y.range = [vert1, vert2]
285        5:!y.range = [0, boxzoom[4]]
286        6:!y.range = boxzoom[4:5]
287      endcase
288      if NOT keyword_set(ov1d) then !y.range = reverse(!y.range)
289    END
290  ENDCASE
291;-----------------------------------------------------------
292;-----------------------------------------------------------
293;   definition des axes
294;----------------------------------------------------------
295;    if keyword_set(integrationtps) then axe, type, time[0], time[jpt-1], SIN = sin, _extra = ex $
296;    ELSE axe, type, SIN = sin
297  if NOT keyword_set(ov1d) then axe, type, SIN = sin
298;------------------------------------------------------------
299;------------------------------------------------------------
300; dessin
301;------------------------------------------------------------
302;------------------------------------------------------------
303  if type EQ 'z' then begin
304    idx = where(xx NE valmask)
305    if NOT keyword_set(ov1d) then BEGIN
306      if min EQ mi then !x.range = [min-abs(max-min)/5., max+abs(max-min)/5.] $
307      ELSE !x.range = [min, max]
308    ENDIF
309  ENDIF ELSE BEGIN
310    idx = where(yy NE valmask)
311    if NOT keyword_set(ov1d) then BEGIN
312      if min EQ mi then !y.range = [min-abs(max-min)/5., max+abs(max-min)/5.] $
313      ELSE !y.range = [min, max]
314    ENDIF
315  ENDELSE
316;
317  if NOT keyword_set(ov1d) then BEGIN
318    legende, mi, ma, type, CONTOUR = contour, DIREC = direc, ENDPOINTS = endpoints, _EXTRA = ex
319;
320  ENDIF
321  IF keyword_set(switchxy)  THEN BEGIN
322    tmp = xx
323    xx = yy
324    yy = temporary(tmp)
325    if NOT keyword_set(ov1d) then BEGIN
326      tmp = !x
327      !x = !y
328      !y = temporary(tmp)
329    ENDIF
330  ENDIF
331  if NOT keyword_set(ov1d) then BEGIN
332    if keyword_set(reverse_x) then !x.range = reverse(!x.range)
333    if keyword_set(reverse_y) then !y.range = reverse(!y.range)
334  ENDIF
335;
336  xx = xx[idx]
337  yy = yy[idx]
338  if (not keyword_set(col1d)) then col1d = 0
339  if keyword_set(sty1d) then BEGIN ;si on veut faire des barres
340    IF strlowcase(strtrim(sty1d)) EQ 'bar' then begin
341      !y.range = [!y.range[0]-(!y.range[1]-!y.range[0])*.05, !y.range[1]]
342      bar_plot, yy, background = (!d.n_colors-1) < 255,  $
343        baselines = replicate(!y.range[0], n_elements(yy)), barnames = ['', ''], $
344        colors    = replicate(col1d, n_elements(yy)), /outline
345      if n_elements(ex) NE 0 then BEGIN
346; pour avoir un cadre de la couleur noire
347        if (where(tag_names(ex) EQ 'COLOR'))[0] NE -1 then ex.COLOR = 0
348      ENDIF
349      plot, [0], [0], /noerase, /nodata, _extra = ex
350      GOTO, fini
351    ENDIF
352  ENDIF
353;
354  if NOT keyword_set(ov1d) then BEGIN
355;
356    plot, xx, yy, color = col1d, linestyle = sty1d, thick = 2, title = '', subtitle = '', _extra = ex
357    if n_elements(ex) NE 0 then BEGIN
358; pour avoir un cadre de la couleur 0 et trace une ligne a y=0
359      if (where(tag_names(ex) EQ 'COLOR'))[0] NE -1 then ex.COLOR = 0
360      if (where(tag_names(ex) EQ 'LINESTYLE'))[0] NE -1 then ex.LINESTYLE = 0
361      if (where(tag_names(ex) EQ 'THICK'))[0] NE -1 then ex.THICK = 0
362    ENDIF
363    plot, !x.range, [0, 0], /noerase, /nodata $
364      , xstyle = 1+4*(keyword_set(endpoints) AND $
365                      ((type EQ 'x' AND lat1 NE lat2) OR (type EQ 'y' AND lon1 NE lon2))) $
366      , ystyle = 1, _extra = ex
367; ajout d'un axe ds le cas ou l'on utilise endpoints
368    if keyword_set(endpoints) then addaxe, endpoints, type, posfenetre, _EXTRA = ex
369; trace une ligne a x=0
370    plot, [0, 0], !y.range, /noerase, /nodata, title = '', subtitle = '', _extra = ex
371  ENDIF ELSE oplot, xx, yy, color = col1d, linestyle = sty1d, thick = 2, _extra = ex
372;------------------------------------------------------------
373;------------------------------------------------------------
374; 3eme partie: impression eventuelle
375;------------------------------------------------------------
376;------------------------------------------------------------
377fini:
378  terminedessin, _extra = ex
379  if keyword_set(savedbox) THEN restoreboxparam, 'boxparam4plt1d.dat'
380;------------------------------------------------------------
381  if n_elements(key_performance) NE 0 then $
382    IF key_performance EQ 1 THEN print, 'temps plt1d', systime(1)-tempsun
383;------------------------------------------------------------
384;------------------------------------------------------------
385;------------------------------------------------------------
386  return
387end
388
389
Note: See TracBrowser for help on using the repository browser.