Re: Plot axis length and size ratio (TwoPlot revive)

*To*: mathgroup at smc.vnet.net*Subject*: [mg121581] Re: Plot axis length and size ratio (TwoPlot revive)*From*: Jaebum Jung <jaebum at wolfram.com>*Date*: Wed, 21 Sep 2011 05:32:24 -0400 (EDT)*Delivered-to*: l-mathgroup@mail-archive0.wolfram.com

You could also define function like this: TwoAxisPlot[{f_, g_}, {x_, x0_, x1_}, opts : OptionsPattern[]] := Module[ {f0, f1, g0, g1, scale, gticks, style, ymid}, style = PlotStyle /. {opts} /. (PlotStyle -> {Blue, Red}); {f0, f1} = Options[Plot[f, {x, x0, x1}, Frame -> True, opts], PlotRange][[1, 2, 2]]; {g0, g1} = Options[Plot[g, {x, x0, x1}, Frame -> True, opts], PlotRange][[1, 2, 2]]; If[f0 < 0 && f1 > 0, ymid = f0 + ((f1 - f0) (0 - g0))/(g1 - g0), ymid = 0]; scale[y_] := f0 + ((f1 - f0) (y - g0))/(g1 - g0) - ymid; gticks = AbsoluteOptions[ Plot[g, {x, x0, x1}, PlotRange -> Evaluate[1/2 {{3, -1}, {-1, 3}}.{g0, g1}], Frame -> True], FrameTicks][[1, 2, 2]] /. {{tk_?NumericQ, lb_?NumericQ, _, _} :> {scale[tk], lb, {.01, 0}}, {tk_?NumericQ, "", _, _} :> {scale[tk], "", {.005, 0}}}; Plot[{f, scale[g]}, {x, x0, x1}, Frame -> True, AxesOrigin -> {x0, Min[f0, scale[g0]]}, FrameTicks -> {{Automatic, gticks}, {Automatic, None}}, FrameStyle -> {style, {{}, {}}}, PlotStyle -> style, opts ] ] TwoAxisPlot[{x Sin[x], x (x - 10) Cos[x]}, {x, 0, 10}] TwoAxisPlot[{x Sin[x], x (x - 10) Cos[x]}, {x, 0, 10}, GridLines -> Automatic] Sincerely, Jaebum ----- Original Message ----- From: "matyigtm" <matyigtm at gmail.com> To: mathgroup at smc.vnet.net Sent: Monday, September 19, 2011 6:06:43 AM Subject: [mg121581] Plot axis length and size ratio (TwoPlot revive) Hi, I want to combine two plots with the same "x" axis into one graphic. Because the two plots have different magnitude, I choosed the "Inset" command inside of one of the two plots. I want to put the two "y" axes on left and right for the two plots, resp. (aka. TwoPlot) My problem is that the two plots take different sizes when the numbers written at the ticks on the "y" axis get different length, or when AxesLabel is used. I've understood the the area of the plot is extended by PlotRangePadding and with ImagePadding, but I cannot retrieve the latter from the plots to get the right sizes. The Inset command help a lot to position the origins of the two plots, but its "size" parameter looses any relation to the coordinates used in the plots. The following example illustrates the problem, the hardcoded number 1.045 is to be programmed to give good results. plt2 = Plot[x (x - 10) Cos[x], {x, 0, 10}, PlotStyle -> Red, AxesOrigin -> {10, 0}, AxesStyle -> Red]; Plot[x Sin[x], {x, 0, 10}, Epilog -> Inset[plt2, {0, 0}, {0, 0}, 10 * 1.045] Any idea to align the two plots is appreciated, Matyi