Re: Tick control
- To: mathgroup at christensen.cybernetics.net
- Subject: [mg467] Re: [mg455] Tick control
- From: Ross Moore <ross at zeus.mpce.mq.edu.au>
- Date: Tue, 14 Feb 95 19:54:57 +1100
Hello Paul, and others > ... I also > don't want to explicitly write out each individual tick as > suggested in the Mathematica handbook. I would also like more > control over the appearance of the ticks, such as length and > thickness, without addressing each individual tick. Here is a technique for (relatively) easy control over the ticks in a 2-D or 3-D graphic, using Show, provided you know your 1. PlotRange 2. BoxRatios as well as 3. the range of values that you want marked as ticks (which may be in a different coordinate system to the PlotRange). It allows you to have Primary and Secondary ticks of different lengths, labelling only the Primary ticks which occur every k-th tick, starting after some given offset. The `k' and `offset' can be different for each axis. I tried to incorporate the `style' option for ticks (as a 4-th argument), but could not get Thickness or Hue to produce any difference (Version 2.2.2) despite what it says in the bible --- does anyone know what is wrong here? (* Here is a set of parameters that I have used recently. *) fullRange= {{0,622},{0,362},{0,11/12}}; realBoxRatios={32.5, 19, 18}; tickRanges={Range[0,32],Range[0,18],Range[0,18]}; tickLabelSeps = {4,4,4}; tickOffsets={0,0,0}; {longTick,shortTick} = {.015,.01}; tickSpecifiers={({0,#})&,({0,#})&,({0,#})&}; (* this is the function that does all the work... *) tickMaker := Module[ { orig=fullRange[[#]] , ratio=realBoxRatios[[#]] , labelSep= tickLabelSeps[[#]] , tickRange=tickRanges[[#]] , offset=tickOffsets[[#]] , spec=tickSpecifiers[[#]] (* , style=tickStyles[[#]] *) } , Join[ {(orig//First)+((orig//Last)-(orig//First))*#/ratio} , If[Mod[#-offset,labelSep]==0 , {#,spec@longTick} (* , {#,spec@longTick, style} *) , {"", spec@shortTick} ] ]& /@ tickRange ]& ; (* Here is how to use it with Show ... *) Show[Graphics3D[{ (* some graphics *) }] , Axes->True , PlotRange->fullRange , BoxRatios->realBoxRatios , Ticks->(tickMaker/@Range[3]) ] Enjoy the empty box. :-) Of course you could build a function which takes fullRange, realBoxRatios, tickRanges, etc. as arguments, rather than reading them as global variables. More `functional' would be to define them as arguments to something called `ShowWithTicks', which also does the Show, along with consistent PlotRange and BoxRatios. Regards, Ross ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Ross Moore Internet: ross at mpce.mq.edu.au Mathematics Department Work: +61 2 850-8955 Macquarie University Home: please do not try North Ryde, Sydney Fax: +61 2 850-8114 Australia 2109 WWW: http://www.mpce.mq.edu.au/~ross/ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~