rsc503@csc.anu.oz (08/07/90)
Hi, I realise that this is a fairly mundane request, but I was hoping that somebody could give me, or tell me where to find, an algorithm for determining appropriate axis divisions for plots. The min and max values could range over zero to many orders of magnitude and be +ve or -ve, so I need a good general routine. I want "sensible" max and mins, and "sensible" divisions. I think that the answer would have something to do with taking logs of the range, etc. You may e-mail to the address below if you like. Thanking you in anticipation, Ian Jamie -------------------------------------------------------------------------------- jamie@rsc0.anu.oz.au |"We have sailed many weeks, we have sailed many Ian Jamie | days Research School of Chemistry | (Seven days to the week I allow), Australian National University | But a Snark, on which we lovingly gaze, Canberra, ACT, Australia | We have never beheld till now!" Lewis Carroll --------------------------------------------------------------------------------
maine@elxsi.dfrf.nasa.gov (Richard Maine) (08/08/90)
Ian Jamie asked about plot scaling routines. I tried email, figuring
the reply didn't really merit a post. But my mailer can't find his
system (probably has to do with it being in Austrailia), so suppose
I`ll break down and post it.
Here's my plot scaling routine. Nothing fancy, but it works fine for
me. Do with it what you like; it is not copyrighted.
subroutine scale3(xmin,xmax,axlen,expand,amn,asc,ticdst)
c Richard Maine. 9 Feb 86.
c determine reasonable plotting scales.
c******************** common.
c I normally have something like the following in an 'include' here.
c Expanded by hand in this copy.
c Also commented out for ANSI conformance.
c implicit none
c******************** interface.
c xmin,xmax(input): data min and max values which must fit on scale.
c axlen(input): axis length in cm or other scaled units.
c Reasonable results are not guaranteed if axlen .lt. 2.
c expand(input): can tic interval be expanded?
c amn(output): minimum value on scaled axis.
c asc(output): axis scale in units/cm. A scale of -999. indicates
c xmin ge xmax
c ticdst(output): interval between tics in cm.
c Will always be 2 if expand is false.
double precision xmin,xmax,axlen,amn,asc,ticdst
logical expand
c******************** externals.
intrinsic log10,nint,anint
c******************** local.
integer nfacs
parameter (nfacs=5)
integer i,nTics
double precision facs(nfacs),evencm,upercm,expon
save facs
data facs/1.,2.,5.,10.,20./
c--------------------------- executable code --------------------------
ticdst = 2.
if (xmax.le.xmin) then
amn = xmin
asc = -999.
else
evencm = 2.
if (xmin.lt.0. .and. xmax.gt.0. .and. axlen.lt.4.) evencm=1.
upercm = (xmax-xmin)/axlen
expon = 10.**nint(log10(upercm)-.5)
do 100 i = 1 , nfacs
asc = facs(i)*expon
amn = asc*evencm*anint(xmin/(asc*evencm)-.499)
if (amn+axlen*asc .ge. xmax) go to 200
100 continue
200 continue
if (expand) then
nTics = (xmax-amn)/(ticdst*asc) + .99999
ticdst = axlen/nTics
asc = asc*2./ticdst
endif
endif
return
end
--
Richard Maine
maine@elxsi.dfrf.nasa.gov [130.134.64.6]