[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: PLOT question



Stuart Colley wrote:
> What I want to do is swap time for phase angle, so the phase is
> somewhere between 0 - 2pi, but the problem is that the phase angle
> repeats,  so what I was looking for on the axis was something
> like:
> 
> y value |
>         |
>         |       x                   x
>         | x          x          x          x           x
> ________|__________________x_____________________x___________
> time    | 0   pi/2   pi  3pi/2  0  pi/2   pi   3pi/2   0  etc...
> 
>                                 |
>                end of first cycle, start of second
> 
> What I'll probably do is use xtickv and xtickname to set the ticks, since
> as far as I can tell, you MUST 'plot, t, y' to get the plot right,
> 'plot, phase, y' results in the data being merged together and only one
> cycle being plotted.
> 
> The reason I sent the first post - I was wondering if there was an easier
> way than xtickv/xtickname since it can't automatically choose the tick
> values like PLOT can, and isn't so flexible when I'm trying to write a
> general purpose routine.


The XTICKFORMAT mechanism as proposed by Dave should give you the
periodic phase angle tick values, if you plug in the logic by Craig:

FUNCTION PHASE_ANGLE, axis, index, t
  phase = (t-t0)/period
  phase = phase - floor(phase)
  ; this phase angle goes from 0 to 1, you want 0 - 2pi:
  phase = 2*!PI*phase
  RETURN, STRING(phase)
END
..
PLOT, t, y, XTICKFORMAT='PHASE_ANGLE'

Now PLOT will automatically choose "nice" tick values based on the
original time values, e.g. 1 s, 2 s, ... You would like "nice" values in
phase angle (pi, 2pi, ..), so I would plot as a function of t/period
(actually the total phase angle), just to get the tick marks at nice
locations:

FUNCTION PHASE_ANGLE, axis, index, totalphase
  phase = totalphase - floor(totalphase)
  ; this phase angle goes from 0 to 1, you want 0 - 2pi:
  phase = 2 * !pi * phase
  RETURN, (FORMAT_AXIS_VALUES(phase))[0]
END
..
t0 = 0  ; starting time of first (or any) period
PLOT, (t-t0)/period, y, XTICKFORMAT='PHASE_ANGLE'

One important thing here: you need to make sure that IDL uses at least
two tick marks per period, or else these nice periodic tick values will
look just like a ordinary series of zeroes. (for this, set the XTICKS
keyword if necessary)

I used FORMAT_AXIS_VALUES to get "nice" formatting of the strings. If
you *really* want "3pi/2" at your tick mark instead of 4.71 , then that
should not be too difficult to code into the PHASE_ANGLE function.
Better left as an exercise to the reader...

  Jaco

 ------------------------------
Jaco van Gorkom            gorkom@rijnh.nl
FOM-Instituut voor Plasmafysica Rijnhuizen