MathGroup Archive 2009

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: ListLogLinearPlot with two y-axis

Here is an example of a two-axis log-linear plot using Presentations. We
plot the two functions Sqrt[n] and n^2 over the domain 1 to 100 on a log
scale. n^2 is scaled to fit in the Sqrt[n] range and a custom tick scale is
generated for it on the right hand side of the frame. n^2 and its ticks are
shown in red. Since we are dealing with underlying graphics primitives we
also have to construct our own log tick scale for the n axis.


The following generates two sets of data points for the functions.

domainpoints = Union[Range[2, 20, 1]/2, 10 Range[20]/2] // N;
dataset1 = Table[{n, Sqrt[n]}, {n, domainpoints}];
dataset2 = 
  Table[{n, Rescale[n^2, {0, 10000}, {0, 10}]}, {n, domainpoints}];

The following specifies the custom tick scales we need. One is a log scale
specifying the power range and the list of labeled and unlabeled ticks. The
second is a linear scale going from 0 to 10000 in steps of 2000 with 4
unlabeled intervals between the labeled ticks. The values are shown in Red.

xticks = CustomTicks[Log, {0, 2, {1, 2, 5}, {3, 4, 6, 7, 8, 9}}];
yticksright = 
  CustomTicks[Rescale[#, {0, 10000}, {0, 10}] &, {0, 10000, 2000, 4},
   CTNumberFunction -> (Style[#, Red] &)];

The following draws the plot with a text label within the plot.

 {Text[Style["Two-Scale Plot", 14, Bold], Scaled[{.1, .9}], {-1, 0}],
  ListLogLinearDraw[dataset1, Joined -> True],
  Red, ListLogLinearDraw[dataset2, Joined -> True]},
 AspectRatio -> .7,
 Frame -> True,
 FrameTicks -> {{Automatic, yticksright}, {xticks, 
    xticks // NoTickLabels}},
 FrameLabel -> {{Sqrt[n], Style[n^2, Red]}, {n, None}},
 RotateLabel -> False,
 ImageSize -> 400]

David Park
djmpark at  

From: pasQualle [mailto:pschulthess at] 

Hi everybody,

I came across a solution for the plotting of continuous functions with
two y-axis. I also found code to plot two lists with different ranges
into one figure with two y-axis, but the thing I need is to plot two
lists into one figure with two y-axis where the x-axis is in log.

So, the solution for the lists looks like:

TwoAxisListPlot[f_List, g_List, frange_, grange_, color1_, color2_,
  opts___?OptionQ] :=
 Module[{old, new, scale, fm, fM, gm, gM, newg}, {fm, fM} = frange;
  {gm, gM} = grange;
  scale[var_] := ((var - gm) (fM - fm))/(gM - gm) + fm;
  old = AbsoluteOptions[
     ListPlot[g, Frame -> True, PlotRange -> grange,
      DisplayFunction -> Identity], FrameTicks][[1, 2, 2]];
  new = (Prepend[Rest[#1], scale[First[#1]]] &) /@ old;
  newg =
     Map[scale, Transpose[g][[2]], {1, 2}]}];
  ListLinePlot[{f, newg}, Frame -> True,
   FrameTicks -> {Automatic, Automatic, None, new},
   PlotStyle -> {{color1}, {color2}},
   FrameStyle -> {{}, {color1}, {}, {color2}},
   PlotRange -> frange*(1 + .00 (fM - fm)), opts]]

And to plot the lists:

TwoAxisListPlot[data1, data2, {5, 8.3}, {450, 460}, Red, Blue,
Axes -> False, Joined -> {True, False},
PlotMarkers -> {Style[\[EmptyCircle], Red, Medium,
Background -> White],
Style[\[FilledUpTriangle], Blue, Medium]} ], {Style["X",
FontFamily -> Times],
Style["Y", Red, FontFamily -> Times]}, {Bottom, Left}],
Style["Y-alt", Blue, FontFamily -> Times], Right]

I'm really not that a Mathematica Pro to translate this for my
purpose. Can anyone of you help me with this?
I would really appreciate it.



  • Prev by Date: Intersection of line and a surface of revolution - a problem with
  • Next by Date: Re: Problem with a 1st order IV ODE (nonlinear)
  • Previous by thread: Re: ListLogLinearPlot with two y-axis
  • Next by thread: Re: ListLogLinearPlot with two y-axis