Re: How to plot with a reversed Y-axis?
- To: mathgroup at smc.vnet.net
- Subject: [mg103544] Re: How to plot with a reversed Y-axis?
- From: Armand Tamzarian <mike.honeychurch at gmail.com>
- Date: Sun, 27 Sep 2009 07:32:52 -0400 (EDT)
- References: <h9i47h$9dh$1@smc.vnet.net> <h9kpgt$ms2$1@smc.vnet.net>
On Sep 26, 5:13 am, Armand Tamzarian <mike.honeychu... at gmail.com>
wrote:
> On Sep 25, 4:58 am, Mather <sdzbb... at hotmail.com> wrote:
>
> > Hi,guys
> > I want to plot with a reversed Y-axis, that is to say, along the Y-
> > axis direction the numbers become smaller.
> > For example:
>
> > ListLinePlot[Table[{i, i^2}, {i, {1, 2, 3, 4, 5, 6}}],
> > PlotRange -> {{0, 8}, {50, 0}}]
>
> > However it does not work.
> > Can anybody help with this?
>
> > Thanks in advance!
>
> Clear[ReverseListPlot];
>
> ReverseListPlot::usage =
> "ReverseListPlot[{list1, list2, \[Ellipsis]}, options] will \
> generate a ListLinePlot with the \!\(\*FormBox[\"x\",
> TraditionalForm]\), \!\(\*FormBox[\"y\",
> TraditionalForm]\), or both \!\(\*FormBox[\"x\",
> TraditionalForm]\) and \!\(\*FormBox[\"y\",
> TraditionalForm]\), axes reversed. ReverseAxis \[Rule] \"X\", \
> ReverseAxis \[Rule] \"Y\", ReverseAxis \[Rule] \"XY\" are specific \
> options. Other options are the same as for ListLinePlot.";
>
> SyntaxInformation[
> ReverseListPlot] = {"ArgumentsPattern" -> {_, OptionsPattern[]}}=
;
>
> Options[ReverseListPlot] =
> Join[Options[ListLinePlot], {ReverseAxis -> "X"}];
>
> ReverseListPlot[data__List, opts : OptionsPattern[]] :=
> Module[{p1, frameticks, grids, ticks, opts1, reverseOpts, data1,
> newXGrids, newYGrids, newXTicks, newXBottomTicks, newXTopTicks,
> newYTicks, newYLeftTicks, newYRightTicks},
>
> (* make framed plot otherwise make axes plot.
> If Axes and Frame are both True no Ticks are produced in \
> ListLinePlot--only FrameTicks are produced,
> so need to produce these separately *)
>
> If[OptionValue[Frame] == True,
> p1 = ListLinePlot[data, Axes -> False, Frame -> True,
> GridLines -> OptionValue[GridLines],
> FrameTicks -> OptionValue[FrameTicks],
> FrameTicksStyle -> OptionValue[FrameTicksStyle],
> PlotRange -> OptionValue[PlotRange]];
> frameticks = AbsoluteOptions[p1, FrameTicks][[1, 2]];
> ticks = {{}, {}};,
> p1 = ListLinePlot[data, Axes -> True, Frame -> False,
> GridLines -> OptionValue[GridLines],
> PlotRange -> OptionValue[PlotRange], Ticks -> OptionValue[Tick=
s],
> TicksStyle -> OptionValue[TicksStyle]];
> ticks = AbsoluteOptions[p1, Ticks][[1, 2]];
> frameticks = {{}, {}, {}, {}};
> ];
>
> grids = AbsoluteOptions[p1, GridLines][[1, 2]];
> opts1 = FilterRules[{opts}, Options[ListLinePlot]];
> reverseOpts =
> FilterRules[Options[ReverseListPlot], Options[ListLinePlot]];
>
> Switch[OptionValue[ReverseAxis],
> "X",
> (* using map in case of multiple lists of data *)
>
> data1 = (# /. {x_, y_} -> {-x, y} &) /@ data;
> newXGrids = grids[[1]] /. {x_?NumericQ, z__} -> {-x, z};
> newYGrids = grids[[2]];
> newXTicks = ticks[[1]] /. {x_?NumericQ, y_, z__} -> {-x, y, z};
> newYTicks = ticks[[2]];
> {newXBottomTicks, newXTopTicks} =
> frameticks[[{1, 3}]] /. {x_?NumericQ, y_, z__} -> {-x, y, z};
> {newYLeftTicks, newYRightTicks} = frameticks[[{2, 4}]];,
> "Y",
> data1 = (# /. {x_, y_} -> {x, -y} &) /@ data;
> newXGrids = grids[[1]];
> newYGrids = grids[[2]] /. {x_?NumericQ, z__} -> {-x, z};
> newXTicks = ticks[[1]];
> newYTicks = ticks[[2]] /. {x_?NumericQ, y_, z__} -> {-x, y, z};
> {newXBottomTicks, newXTopTicks} = frameticks[[{1, 3}]];
> {newYLeftTicks, newYRightTicks} =
> frameticks[[{2, 4}]] /. {x_?NumericQ, y_, z__} -> {-x, y, z};,
> "XY",
> data1 = (# /. {x_, y_} -> {-x, -y} &) /@ data;
> newXGrids = grids[[1]] /. {x_?NumericQ, z__} -> {-x, z};
> newYGrids = grids[[2]] /. {x_?NumericQ, z__} -> {-x, z};
> newXTicks = ticks[[1]] /. {x_?NumericQ, y_, z__} -> {-x, y, z};
> newYTicks = ticks[[2]] /. {x_?NumericQ, y_, z__} -> {-x, y, z};
> {newXBottomTicks, newXTopTicks} =
> frameticks[[{1, 3}]] /. {x_?NumericQ, y_, z__} -> {-x, y, z};
> {newYLeftTicks, newYRightTicks} =
> frameticks[[{2, 4}]] /. {x_?NumericQ, y_, z__} -> {-x, y, z};
> ];
>
> ListLinePlot[data1,
> FrameTicks ->
> Join[{newXBottomTicks, newYLeftTicks, newXTopTicks,
> newYRightTicks}],
> Ticks -> Join[{newXTicks, newYTicks}],
> GridLines -> Join[{newXGrids, newYGrids}],
> opts1,
> reverseOpts
> ]
> ]
Should have added some usage examples (incidentally you may notice
this function is relatively slow. Maybe others have ideas to improve
efficiency??):
data = Join[Table[{x, 7 x}, {x, -10, 0}], Table[{x, 0.5 x^3 + x^2 - 2
x}, {x, 0, 10}]];
data1 = Join[Table[{x, -3 x}, {x, -10, 0}], Table[{x, -3 x^3 + 15 x^2
+ 2 x}, {x, 0, 10}]];
ListLinePlot[{data, data1}, GridLines -> None, Axes -> True, Frame ->
True]
ReverseListPlot[{data1, data}, ReverseAxis -> "X", Frame -> True]
ReverseListPlot[{data, data1}, ReverseAxis -> "Y", GridLines -> None,
Frame -> True]
ReverseListPlot[{data1, data}, ReverseAxis -> "XY", Frame -> True]
ReverseListPlot[{data, data1}, ReverseAxis -> "X", GridLines ->
Automatic, Frame -> True]
ReverseListPlot[{data, data1}, ReverseAxis -> "XY", GridLines -> None,
Axes -> True, Frame -> False]
--Mike