Re: Two Y-Axes
- To: mathgroup at smc.vnet.net
- Subject: [mg27313] Re: Two Y-Axes
- From: "Allan Hayes" <hay at haystack.demon.co.uk>
- Date: Tue, 20 Feb 2001 03:05:22 -0500 (EST)
- References: <96q2lp$mtv@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Bob, A scaling function, rather than a factor, will genralize the method: plotTwo[{leftAxisPlot_, rightAxisPlot_}, iter_, opts___] := Module[{pltL, pltR, ytckL, ytckR, maxL, minL, maxR, minR, scale}, pltL = Plot[leftAxisPlot, iter, opts, DisplayFunction -> Identity]; pltR = Plot[rightAxisPlot, iter, opts, DisplayFunction -> Identity]; ytckL = (Ticks /. AbsoluteOptions[pltL])[[2]]; ytckR = (Ticks /. AbsoluteOptions[pltR])[[2]]; maxL = Max[ytckL][[1]]; minL = Min[ytckL][[1]]; maxR = Max[ytckR][[1]]; minR = Min[ytckR][[1]]; scale = minL + ((maxL - minL)*(-minR + #1))/(maxR - minR) &; Plot[{leftAxisPlot, scale[rightAxisPlot]}, iter, Evaluate[ Flatten[{Frame -> True, Axes -> False, FrameTicks -> {Automatic, Automatic, Automatic, ytckR /. {(x__)?NumericQ, z__} :> {scale[x], z}}, opts}]]] ]; Allan --------------------- Allan Hayes Mathematica Training and Consulting Leicester UK www.haystack.demon.co.uk hay at haystack.demon.co.uk Voice: +44 (0)116 271 4198 Fax: +44 (0)870 164 0565 <BobHanlon at aol.com> wrote in message news:96q2lp$mtv at smc.vnet.net... > This will handle simple examples > > plotTwo[{leftAxisPlot_, rightAxisPlot_}, iter_, opts___] := > Module[{pltL, pltR, ytckL, ytckR, maxL, maxR, minR, scale}, > pltL = Plot[leftAxisPlot, iter, opts, DisplayFunction -> Identity]; > pltR = Plot[rightAxisPlot, iter, opts, DisplayFunction -> Identity]; > ytckL = (Ticks /. AbsoluteOptions[pltL])[[2]]; > ytckR = (Ticks /. AbsoluteOptions[pltR])[[2]]; > maxL = Max[ytckL][[1]]; > maxR = Max[ytckR][[1]]; > minR = Min[ytckR][[1]]; > scale= > If[maxR+minR == 0, maxL/maxR, (maxL+Min[ytckL][[1]])/(maxR+minR)]; > Plot[{leftAxisPlot, scale*rightAxisPlot}, iter, > Evaluate[ > Flatten[{Frame -> True, Axes -> False, > FrameTicks -> {Automatic, Automatic, Automatic, > ytckR /. {(x__)?NumericQ, z__} :> {scale*x, z}}, > opts}]]]]; > > red = RGBColor[1, 0, 0]; blue = RGBColor[0, 0, 1]; > > Needs["Statistics`ContinuousDistributions`"]; > > dist = NormalDistribution[mu = 1+Random[], sigma = 2*Random[]]; > > plotTwo[{PDF[dist,x], CDF[dist,x]}, {x, mu-3*sigma, mu+3*sigma}, > PlotStyle -> {blue, red}, > FrameLabel -> { > StyleForm["\nx", FontWeight -> "Bold", FontSize -> 12], > StyleForm["PDF\n", FontWeight -> "Bold", FontSize -> 12, > FontColor -> blue], > StyleForm["Normal Distribution\n", FontWeight -> "Bold", > FontSize -> 14], > StyleForm["\nCDF", FontWeight -> "Bold", FontSize -> 12, > FontColor -> red]}, > ImageSize -> {500, 350}]; > > plotTwo[{x,E^x}, {x,0,10}, PlotRange -> All, PlotStyle -> {blue,red}, > FrameLabel -> { > StyleForm["\nx", FontWeight -> "Bold", FontSize -> 12], > StyleForm["Linear (x)\n", FontWeight -> "Bold", FontSize -> 12, > FontColor -> blue], > None, > StyleForm["\nExponential (e^x)", FontWeight -> "Bold", > FontSize -> 12, FontColor -> red]}, > ImageSize -> {500, 325}]; > > Bob Hanlon > > In a message dated 2001/2/18 5:00:22 AM, hmeier at webshuttle.ch writes: > > >Your code for two (differently scaled) y-axes is a - very - valuable addendum > >to the plotting capabilities of Mathematica. > > > >However, for everyday use it may be preferable to automate ticks and tick > >labels (to give appropriate plot ranges in all cases and to ensure "nice > >round numbers", among other things). > > > >I think of the following steps: > > > >1a) compute plot 1, without rendering it > >1b) extract ticks 1 with AbsoluteOptions[g1,Ticks] > >2a) compute (scaled) plot 2, without rendering it > >2b) extract ticks 2 with AbsoluteOptions[g2,Ticks] > >3) render the combined plot, where ticks 1 and 2 are given as values > > to Option FrameTicks. > > > >The package Ticks.m in ExtendGraphics Packages (Math Source item 0205-041) > >may perhaps also be used to "plug in automatically" tick marks and tick > >labels for the (scaled) second plot. > > > >I was not able to develop a working program along one of those ideas. > > > >The User Group would be certainly interested in a program for differently > >scaled y-axes that would be more automated and therefore easier to use. > >Many people would appreciate if you had some time to spend .... > > >