Opened 18 years ago

Last modified 17 years ago

#15 new enhancement

plttg: generalised axis type in pltt (use for wavelet for example)

Reported by: ericg@… Owned by: somebody
Priority: critical Milestone: virtual machine
Component: component1 Version:
Keywords: Cc:

Description (last modified by pinsard)

;------------------------------------------------------------
;+
; NAME:
;	PLTTG
;
; PURPOSE:
;	trace des graphes hovmoller avec axe generalise
;
; CATEGORY:
;       Graphics, trace des graphes hovmoller: gt
;
; CALLING SEQUENCE:
;	plttg, champ,gaxis [,min[, max[, datmin[, datmax]]]]
;
; INPUTS:
;	champ: le champ dont on veut faire le hovmoller champ
;	peut etre de 2 types:
;	1) un tableu qui peut etre:
;          * 3d ou 4d: la derniere composante etant le temps. dans ce
;            cas, le tableau va passer dans grossemoyenne pour etre
;            moyennee suivant et devenir un tableau 2d ou 1d.
;          * 2d: si tableau est deja 2d, il n''est pas modifie
;            (attention les terres doivent etre masquees a la valeure
;            valmask) et type doit qd meme etre specifie pour qu''on
;            sache de quel trace il sagit. Pour avoir une legende
;            correcte, respecifier la zone d''extraction via BOITE
;          * 1d: uniquement pour les traces de type 't'. Type doit qd
;            meme etre specifie pour qu''on sache de quel trace il
;            sagit. Pour avoir une legende correcte, respecifier la zone
;            d''extraction via BOITE
;       2) une structure repondant aux critaire specifies par
;       litchamp.pro. cf. IDL> xhelp,'litchamp'. Le tableau contennu ds
;       la structure repondant aux criteres du cas 1) cf. ci-dessus
;
;       TYPE: type de hovmoller que l''on veut faire:
;             'yt' only  
;
; ces arguments ne sont pas obligatoires:
;  
;	MAX: valeur maximum que l''on veut prendre en compte dans le trace
; des contours. Par defaut on prend le max de tableau (sur les pts mer)
;
;	MIN: valeur minimum que l''on veut prendre en compte dans le trace
; des contours. Par defaut on prend le min de tableau (sur les pts
; mer)
;
;       DATMIN: c''est la borne inf de l''axe temporel. c''est un
;       longinteger de la forme yyyymmdd (ou bien yymmdd).
;
;       DATMAX: c''est la borne max de l''axe temporel. c''est un
;       longinteger de la forme yyyymmdd (ou bien yymmdd)
;
; KEYWORD PARAMETERS:
;
;	BOITE:vecteur indiquant la zone geographique (3d) sur laquelle doit
; etre fait l''extraction du champ pour faire le hovmoeller.
; Si BOITE a :
; 1 element : l''extraction est faite sur [lon1, lon2, lat1, lat2, 0.,boite[0]]
; 2 elements: l''extraction est faite sur [lon1, lon2, lat1, lat2, boite[0],boite[1]]
; 4 elements: l''extraction est faite sur [Boite, prof1, prof2]
; 5 elements: l''extraction est faite sur [Boite[0:3], 0, Boite[4]]
; 6 elements: l''extraction est faite sur Boite
;
; Ou lon1, lon2,lat1,lat2,prof1,prof2 sont les variables globales
; definies lors du dernier domdef!
;
;      CB_TITLE: le titre de la colorbar
;
;      CB_SUBTITLE: le soustitre de la colorbar
;
;      CB_CHARSIZE: The character size of the color bar annotations
;
;	CONTINTERVALLE: lorsque CONTOUR est active, valeur d''un
; intervalle entre deux isolignes traces par un trait ds la couleur
; c_lab. Il peut ainsi etre different de celui specifie par INTERVALLE
; qui, cas ce cas, ne controle que les isolignes coloriees en
; couleurs. Si aucun min n''est specifie, on choisit un contour min qui va
; bien avec l''intervalle specifie!. Si ce mot cle n''est pas
; specifie, on trace 20 isolignes du min au max. 
;
;	CONTLABEL: un entier n. lorsque CONTOUR est active, si n
; different de 0, choisit le type de label correspondant aux cas n
; pour les isolignes tracees par un trait. Pour specifier le type de
; label du contour en couleur, utiliser LABEL
;
;	CONTMAX: lorsque CONTOUR est active, valeur maximum que l''on
; veut prendre en compte dans le trace des isolignes traces par un
; trait de couleur c_lab. Par defaut on prend le max (sur les pts mer)
; du tableau passe ds le mot cle CONTOUR. 
;
;	CONTMIN: lorsque CONTOUR est active, valeur minimum que l''on
; veut prendre en compte dans le trace des isolignes traces par un
; trait de couleur c_lab. Par defaut on prend le max (sur les pts mer)
; du tableau passe ds le mot cle CONTOUR. 
;
;	CONTNLEVEL: lorsque CONTOUR est active, nombre de contours
; trace par un trait de couleur c_lab a dessiner (actif si
; CONTLABEL=0) par defaut =20.
;
;	CONTOUR: si on veut tracer les contours d''un champ different que celui
; que l''on dessin en couleur (par ex E-P en couleur et QSR en
; contours). Doit etre un champ reponadnt aux meme caracteristiques
; que l''argument numero 1 de pltt
;
;       ENDPOINTS: mot clef specifiant que l'on veut faire une coupe
;       verticale en diagonale. les coordonnees des extremites de
;       celle-ci sont alors definies les 4 elements du vecteur
;       ENDPOINTS: [x1,y1,x2,y2] qui sont les coordonnees 
;
;       /EXCHANGE_XY: permet d''intervertir les axes.
; 
;       FILTER: applique une moyenne glissante de largeur FILTER
; 
;	INTERVALLE: valeur d''un intervalle entre deux isolignes. Si
; aucun min n''est specifie, on choisit un contour min qui va bien
; avec l''intervalle specifie!. Si ce mot cle n''est pas specifie, on
; trace 20 isolignes du min au max. Rq: Qd CONTOUR est active
; INTERVALLE ne specifie que intervalle entre 2 isolignes coloriees en
; couleur. Pour specifier l''intervalle entre 2 isolignes traces par un trait
; de couleur c_lab utiliser CONTINTERVALLE.
;
;	/INV: inverse le vecteur couleur utilise pour colorier le graphe
;             (sans toucher au noir, au blanc et a la palette utilisee)
; 
;	LABEL: un entier n. si n different de 0, choisit le type de
; label correspondant aux cas n. cf label.pro
; Rq: Qd CONTOUR est active, ne specifie le type de label que pour les
; isolignes coloriees en couleur. Pour celles tracees par un trait de
; couleur c_lab utiliser CONTLABEL.
;
;	/LANDSCAPE: oblige la feuille ou le fenetre a l''ecran a etre
;	en position "allongee".
;	
;       LCT: entier designant le numero de la palette de couleur que
;       l''on veut utiliser pour le plot. 
;	
;       COL1d: --OBSOLETE--numero de la couleur qd on fait un trace 1d
;       par defaut, 0. il faut mieux utiliser le mot cle COLOR utilise
;       par plot
;
;       MAXIN: permet de specifier la valeur maximum que l''on veut
;       prendre en compte dans le trace des contours a l''aide d''un
;       mot cle plutot que par l''argument max. Si l''argument et le
;       mot cle sont specifies en meme temps, c''est la valeur
;       specifiee par le mot cle qui est retenue.
;
;       MININ: permet de specifier la valeur minimum que l''on veut
;       prendre en compte dans le trace des contours a l''aide d''un
;       mot cle plutot que par l''argument min. Si l''argument et le
;       mot cle sont specifies en meme temps, c''est la valeur
;       specifiee par le mot cle qui est retenue.
;
;	NLEVEL: nombre de contours a dessiner. par defaut =20. actif si
; LABEL=0 ou n''est pas specifie.
;
;	CONTNLEVEL: nombre de contours a dessiner qd on utilise ajoutcontour
; active par le mot cle CONTOUR.(actif si CONTLABEL=0) par defaut =20.
;
;	/NOCOLORBAR: activer si on ne veut pas de colorbar
;
;	/NOCONTOUR: activer si on ne veut pas de contour mais juste
;	les couleurs
;
;	/NOCOULEUR: activer si on veut juste les contours en noir et
;	blanc sur fond blanc
;
;       /NOERASE: activer pour faire un dessin a l''ecran sans creer
; une nouvelle fenetre. Rq: activer ds le cas d''un Postscript de
; plusieurs traces de type 't' pour ne pas faire un Postscript de
; plusieurs pages 
;
;       /OV1D:permet de surimprimer un courbe 1d a un precedent trace 1d.
;
;       OVERPLOT: pour faire un pltt par dessus un autre. Rq:
;       contrairemnet a l''utilisation de CONTOUR,
;       l''utilisation de ce mot clef ne modifie pas la legende ou/et
;       la barre de couleur. dans le cas d''un plot 1d, contrairement
;       a ov1d, on peut changer les axes et les ranges.
;
;	PETITDESSIN: vecteur de 3 ou 4 elements, applique pour faire un
; dessin sur une petite portion de feuille ou d''ecran. il delimite
; la zone ds laquelle va etre fait le dessin
; si il a 4 elements:
;       il est alors constitute des coordonnees -exprime en cm reperes par
;       rapport au coin en bas a gauche de la feuille ou de la fenetre
;       (en portrait comme en landscape)- du coin en bas a
;       gauche et du coin en haut a droite  de la zone de dessin.
; si il a 3 elements:
;       Ds ce cas, on divise la fenetre ou l''ecran en PETITDESSIN[0]
;       colonnes, en PETITDESSIN[1] lignes le dessin se faisant ds la
;       case numero PETITDESSIN[2].La numerotation commencant en haut
;       a gauche par le numero 1 et suivant apres dans le sens de
;       l''ecriture.
; Par defaut on fait un dessin occupant la plus grande place possible
; tout en concervant le rapport d''aspect (sauf qd REMPLI est active)
;
;	/PORTRAIT: oblige la feuille ou la fenetre a etre en position "debout".
;
;	/POST: faire une sortie postscript. Ne marche que si on fait
;	un seul dessin sur la feuille. Si on fait plusieurs dessins,
;	utiliser @ps ou plein2dessins
;
;       REPEAT_C=n pour repeter une serie temporelle n fois
;
;	/REMPLI:oblige le dessin a occuper l''espace maximum definit
;	par petitdessin
;
;       /REVERSE_X: pour inverser l''axe des x (et aussi le dessin)
;
;       /REVERSE_Y: pour inverser l''axe des y (et aussi le dessin)
;
;       /STRICTFILL: activer ce mot clef pour que le remplissage des
;       contours ce fasse precisement entre le min et le max specifie
;       en laissant en banc les valeurs inferieurs au min specifie et
;       superieurs au max specifie.
;
;	STYLE: style de tracer a adopter pour dessiner les isolignes par
; defaut style=0. cf style.pro
;
;       STY1D: --OBSOLETE--numero du style utilise lors d''un trace
;       1d. Il faut mieux utiliser le mot cle LINESTYLE qui est celui
;       de plot. Attention ce mot cle est encore utile si on veut
;       faire des barres plutot qu''une courbe, mettre sty1d='bar'
;
;	/TRANS: fait un postscript (active /post automatiquement) et l''imprime
; -si on le desire- sur un transparant
;
;        TREND_TYPE: modify data by calling trends.pro
;
;        TYPEIN: permet de specifier la valeur type de hovmoller que
;        l''on veut faire:
;             'xt','yt','zt','t'  
;       a l''aide d''un mot cle plutot que par l''argument type Si
;       l''argument et le mot cle sont specifies en meme temps, c''est
;       la valeur specifiee par le mot cle qui est retenue.
;
;       /USETRI: pour forcer a utiliser de triangulation.
;
;        UNLABSUR: entier n. specifant qu''on ne labelle qu''un
;        contour sur n. Par defaut unlabsur=2
;
;	/UNSUR2: si on veut tracer un countour sur deux. par  defaut trace
; tous les contours
;
;	WINDOW: nimero de la fenetre ou l''on veut faire le graphe (permet
; d'ouvrir plusieurs fenetres). par defaut on ouvre 'IDL0'
;
;	YSURX: rapport d'echelle entre y et x. Par defaut=1
; Par defaut on adapte pour occupe une grande partie de la feuille en sortie
; postScript ou pour cree une fenetre pas trop etiree
;
; COMMON BLOCKS:
;	common.pro
;
; SIDE EFFECTS:
;
; RESTRICTIONS:
;
; EXAMPLE:
;
; MODIFICATION HISTORY: Sebastien Masson (smasson@lodyc.jussieu.fr)
;			27/5/98
;                       Jerome Vialard (adapting plt to hovmoller drawing)
;                       2/7/98
;                       Sebastien Masson 14/8/98 (continents,barres)
;                       15/1/98
; adaptation pour les tableaux 3 et 4d pour que la moyenne soit faite
; dans pltt plutot que lors de la lecture.
;                       Sebastien Masson 14/8/98 
;                       7/1999 
;                       Eric Guilyardi 29/7/99 FILTER, TREND_TYPE,
;                       REPEAT_C 
;                       Sebastien Masson 08/02/2000 checkfield and
;                       usetri keyword.
;-
;------------------------------------------------------------
;------------------------------------------------------------
;------------------------------------------------------------
pro plttg,tab,gaxis,givenmin,givenmax,datmin,datmax,BOITE = boite, CONTOUR=contour $
         ,ENDPOINTS=endpoints,INTERVALLE=intervalle,INV=inv  $
         ,CONTINTERVALLE=contintervalle,LABEL=label,CONTLABEL=contlabel $
         ,STYLE=style, CONTMAX=contmax $
         ,CONTMIN=contmin,NLEVEL=nlevel,CONTNLEVEL=contnlevel $
         ,COL1D=col1d,STY1D=sty1d, MININ = minin, MAXIN = maxin $
         ,OV1D=ov1d, FILTER = filter, TREND_TYPE = trend_type $
         ,REPEAT_C = repeat_c, TYPEIN = typein, XT = XT, YT = YT, ZT = zt $
         , TT = tt, STRICTFILL = strictfill, OVERPLOT = overplot $
         , EXCHANGE_XY = exchange_xy $
         , _extra = ex
@common

   giventype = 'yt'
;------------------------------------------------------------
   tempsun = systime(1)         ; pour key_performance
;--------------------------------------------------------------
; I2) reinitialisation. !p.,!x.,!y.
; Rq: on ne reinitialise pas qd on rapelle plt en boucle pour utiliser contour
;--------------------------------------------------------------
   if n_elements(contour) ne 4 AND NOT keyword_set(overplot) $
    AND NOT keyword_set(ov1d) then reinitplt
;--------------------------------------------------------------
; I1) lecture du champ
;--------------------------------------------------------------
   if keyword_set(boite) then oldboite = [lon1, lon2, lat1, lat2, prof1, prof2]
   if n_elements(giventype) NE 0 then type = giventype
   if n_elements(givenmin) NE 0 then min = givenmin
   if n_elements(givenmax) NE 0 then max = givenmax
   if n_elements(minin) NE 0 then min = minin
   if n_elements(maxin) NE 0 then max = maxin
   if keyword_set(typein) then BEGIN 
      if size(type, /type) NE 7 AND size(type, /type) NE 0 then begin
         if n_elements(min) NE 0 then max = min
         min = type
      endif
      type = typein
   ENDIF

   z2d = tab
   mask = 1

;---------------------------------------------------------------
; selection du type de graphique. 
;---------------------------------------------------------------
;---------------------------------------------------------------
; repetition de la serie temporelle
;---------------------------------------------------------------

   IF NOT keyword_set(repeat_c) THEN repeat_c = 1

   temps = time[0:jpt-1]
   IF repeat_c GT 1 THEN BEGIN
      taille=size(z2d)
      CASE taille[0] OF
         1: z2d = reform(z2d#replicate(1, repeat_c), taille[1]*repeat_c)
         2: BEGIN
            z2d = z2d[*]#replicate(1, repeat_c)
            z2d = reform(z2d, taille[1], taille[2]*repeat_c, /over)
         END 
         ELSE: 
      ENDCASE
      temps = [temps, (lindgen(jpt*(REPEAT_c-1))+1)*(temps[1]-temps[0])+temps[jpt-1]]
   ENDIF 

;----------------------------------------------------------------------------
;   determination du mi:min et du ma:max de z2d ainsi que de max: max et
;    min: min pour le dessin.
;-----------------------------------------------------------------------------
; faudra-t-il faire un autoscale ???
   autoscale = testvar(var = min) EQ testvar(var = max) AND NOT keyword_set(intervalle)
   determineminmax, z2d, mask, mi, ma, MININ = min, MAXIN = max, nan = nan, INTERVALLE = intervalle
   if z2d[0] EQ -1 THEN return
; on fait un autoscale si besoin
   if autoscale then autoscale, min, max, intervalle
;-----------------------------------------------------------------------------
;-----------------------------------------------------------------------------
   if n_elements(contour) ne 4  AND NOT keyword_set(overplot) THEN $
    placedessin, 'pltt',posfenetre, posbar, contour = contour, direc = direc, type = type, endpoints = endpoints, _extra = ex
;--------------------------------------------------------------
;--------------------------------------------------------------
; 2eme partie: dessin
;--------------------------------------------------------------
;-----------------------------------------------------------
;   definition des axes
;----------------------------------------------------------
;-----------------------------------------------------------------------------
; definition des vecteurs abscisse et ordonee
; la triangulation est definie pour que le trace soit effectue du bas
; a gauche vers le haut a droite. il faut donc la matrice e contourer
; se presente de cette maniere, d''ou certains transpose et reverse
;-----------------------------------------------------------------------------
;-----------------------------------------------------------------------------
; definition des bornes de l''axe temporel
;-----------------------------------------------------------------------------
   case N_PARAMS() OF
      5 : begin
         tempsmin = juldate(datmin, _extra = ex)
         tempsmax = temps[(jpt*repeat_c)-1]
      end
      6 : begin
         tempsmin = juldate(datmin, _extra = ex)
         tempsmax = juldate(datmax, _extra = ex)
      end
      else : begin
         tempsmin = temps[0]
         tempsmax = temps[(jpt*repeat_c)-1]
      end
   endcase
;-----------------------------------------------------------------------------
; on shift l''axe du temps pour des questions de precision sur les
; dates du calendier julien en long qui sont passes en float ds les axes
   yy = gaxis
   xx = temps-tempsmin
;--------------------------------------------------------------
   if NOT keyword_set(overplot) THEN axe, type, tempsmin, tempsmax, plttg = 1, _EXTRA = ex ELSE BEGIN 
      !x.range=!x.range-tempsmin
      !x.tickv=!x.tickv-tempsmin
   ENDELSE
;------------------------------------------------------------
;------------------------------------------------------------
; dessin
;------------------------------------------------------------
; 2d
;------------------------------------------------------------
;--------------------------------------------------------------
; choix des labels
;-----------------------------------------------------------
   if keyword_set(intervalle) AND NOT keyword_set(label) then label=1
   if keyword_set(label) eq 0 then cas=0 else cas=label
   label,cas,min,max,ncontour,level_z2d,NLEVEL=nlevel,INTERVALLE=intervalle, strictfill = strictfill
;--------------------------------------------------------------
; choix de style
;-----------------------------------------------------------
   if not keyword_set(style) then style=0
   style,style,level_z2d,linestyle,thick
   if keyword_set(inv) then couleur=reverse(couleur)
;----------------------------------------------------------------------
   nby = n_elements(yy)
   nbx = n_elements(xx)
   xx = xx#replicate(1, nby)    ; on passe les axes en tableaux 2d
   yy = replicate(1, nbx)#yy
   
   triangulation = -1 
;----------------------------------------------------------------------
   pltbase,z2d, xx, yy, mask,xx, yy, level_z2d, couleur, contour = contour,/noerase $
    , c_linestyle=linestyle,c_labels=1-(indgen(n_elements(level_z2d)) MOD 2) $
    , trichamp = triangulation, trimsk = triangulation, overplot = overplot $
    , c_thick=thick, performance = key_performance, usetri = keyword_set(nan) $
    , coinmontemask=coinmontemask, coindescendmask=coindescendmask, _extra = ex
;------------------------------------------------------------
   if n_elements(contour) eq 4 then BEGIN ; c''est la 2eme fois que je passe ds pltt
      contour = {mietma:[mi, ma], unit:varunit, inter:intervalle} ; je renvoie le min, le max et l''unite
      return
   endif
;------------------------------------------------------------
   if keyword_set(contour) then BEGIN 
      pourlegende = [1, 1, 1, 1]
      oldattributs = saveatt()
      oldcouleur = couleur
      plttg,contour,gaxis, contmin,contmax,CONTOUR=pourlegende, /noerase, USETRI = usetri $
       ,INTERVALLE=contintervalle,LABEL=contlabel,STYLE=style, ENDPOINTS = endpoints $
       ,NLEVEL=contnlevel,YSURX=ysurx, BOITE = boite, STRICTFILL = strictfill, _extra = ex
      couleur = oldcouleur
      restoreatt, oldattributs
   endif
;----------------------------------------------------------------------
;----------------------------------------------------------------------
   if keyword_set(overplot) then GOTO, fini
;------------------------------------------------------------
; legendes + affichage de celles-ci
;------------------------------------------------------------
   legende,mi,ma,type, CONTOUR = pourlegende, DIREC = direc, INTERVALLE =  intervalle $
    , plttg = 1, _extra = ex
   plot,[0],[0],/noerase,/nodata,color=c_cote, xstyle = 1, ystyle = 1

;------------------------------------------------------------
; barre de couleur
;------------------------------------------------------------
   couleur = couleur[0:ncontour-1-keyword_set(strictfill)]
   barrecouleur, position=posbar,divisions=(ncontour-keyword_set(strictfill))/2,min=min $
    , max=max,discret=couleur,_extra = ex
;------------------------------------------------------------
fini:
;------------------------------------------------------------
; on remet l''axe du temps en jours julien IDL et non pas en jours
; juliens comptes a partir tempsmin 
;------------------------------------------------------------
   !x.range=!x.range+tempsmin
   !x.tickv=!x.tickv+tempsmin
; on fait un faut plot pour que ces valeurs soient prises en
; consideration
   plot,[0], [0], /noerase,xstyle=5, ystyle = 5, title = '', subtitle = '', ytitle = '', xtitle = ''
;------------------------------------------------------------
;------------------------------------------------------------
   terminedessin, _extra = ex
   if keyword_set(oldboite) then domdef, oldboite,GRILLE=[vargrid, 'T']
;------------------------------------------------------------
   if n_elements(key_performance) NE 0 then $
    IF key_performance EQ 1 THEN print, 'temps pltt', systime(1)-tempsun 
;------------------------------------------------------------
;------------------------------------------------------------
;------------------------------------------------------------
   return
end


Attachments (1)

plttg.pro (21.4 KB) - added by anonymous 18 years ago.

Download all attachments as: .zip

Change History (4)

Changed 18 years ago by anonymous

comment:1 Changed 18 years ago by anonymous

  • Component changed from component1 to component2
  • Milestone set to provide usefull and beautifull documentations
  • Priority changed from major to blocker
  • Type changed from enhancement to task
  • Version set to 2.0

comment:2 Changed 18 years ago by anonymous

  • Component changed from component2 to component1
  • Milestone changed from provide usefull and beautifull documentations to virtual machine
  • Priority changed from blocker to critical
  • Type changed from task to enhancement
  • Version 2.0 deleted

comment:3 Changed 17 years ago by pinsard

  • Description modified (diff)

As trac administrator, I modify the permission list in order to be able to modify ticket 1st part :

saxo@forge$ trac-admin /ipsl/forge/projets/saxo/trac permission add developer TICKET_ADMIN

This allows developer to modify the "Description" of tickets like this one
via URL https://forge.ipsl.jussieu.fr/saxo/ticket/15

Note: See TracTickets for help on using tickets.