Re: programmatically rotating a function plot
- To: mathgroup at smc.vnet.net
- Subject: [mg99469] Re: [mg99395] programmatically rotating a function plot
- From: DrMajorBob <btreat1 at austin.rr.com>
- Date: Wed, 6 May 2009 05:25:26 -0400 (EDT)
- References: <200905050938.FAA20566@smc.vnet.net>
- Reply-to: drmajorbob at bigfoot.com
pic1 is more complicated today, I suppose, as this shows: pic1 = Plot[8 Sin[Pi t] Exp[-t], {t, 0, 4}] Cases[pic1, {x_, y_}, 3] (output suppressed) Not all the {x, y} matches are points on the line. To fix that, we operate on Line primitives, rather than arbitrary 2-element lists. There's ONE line in pic1, with 702 points: Cases[pic1, Line[x_] :> x, Infinity] // Dimensions {1, 702, 2} We transform the graph with, for instance (exploratory first): lineIn=Cases[pic1,Line[x_]:>x,Infinity]//First; Short[line,5] {{8.16327*10^-8,2.05165*10^-6},{0.00122687,0.0307968},<<698>>,{3.99863,-0.000632859},{4.,-3.75773*10^-8}} lineOut=line.{{0, 1}, {-1, 0}}; Short[lineOut,5] {{-2.05165*10^-6,8.16327*10^-8},{-0.0307968,0.00122687},<<698>>,{0.000632859,3.99863},{3.75773*10^-8,4.}} which leads to pic2 = Replace[pic1, Line[x_] :> Line[x.{{0, 1}, {-1, 0}}], Infinity] The problem now is that the new graph has the same x and y limits as the original; but they should be switched. AbsoluteOptions[pic1, PlotRange] {PlotRange -> {{0., 4.}, {-1.87626, 5.1002}}} AbsoluteOptions[pic2, PlotRange] {PlotRange -> {{0., 4.}, {-1.87626, 5.1002}}} That's hidden inside the plot like so: Cases[pic1, Rule[PlotRange, x_] :> x, Infinity] {{{0, 4}, {-1.87626, 5.1002}}} So, to switch the ranges and completely transform the plot requires pic3 = Replace[ pic1, {Rule[PlotRange, {x_, y_}] :> Rule[PlotRange, {-y, x}], Line[x_] :> Line[x.{{0, 1}, {-1, 0}}]}, Infinity] And finally we have pic1 = Plot[8 Sin[Pi t] Exp[-t], {t, 0, 4}]; plot4[p_] := Module[{R, p1, p2, p3}, R[q_] := Replace[q, {Rule[PlotRange, {x_, y_}] :> Rule[PlotRange, {-y, x}], Line[x_] :> Line[x.{{0, 1}, {-1, 0}}]}, Infinity]; p1 = R[p]; p2 = R[p1]; p3 = R[p2]; Show[p, p1, p2, p3]]; plot4[pic1] That also fails, however, since Show takes its options from the first graph. We need a PlotRange that reveals all 4 graphs at once, which is accomplished with pic1 = Plot[8 Sin[Pi t] Exp[-t], {t, 0, 4}]; plot4[p_] := Module[{R, p1, p2, p3}, R[q_] := Replace[q, {Rule[PlotRange, {x_, y_}] :> Rule[PlotRange, {-y, x}], Line[x_] :> Line[x.{{0, 1}, {-1, 0}}]}, Infinity]; p1 = R[p]; p2 = R[p1]; p3 = R[p2]; Show[p, p1, p2, p3, PlotRange -> All]]; plot4[pic1] Oddly interesting. In general, I used FullForm, Cases, and Replace to sleuth the internals of plots, and I tried to be as general as possible. I can't promise the final code will work in version 8 of Mathematica. Bobby On Tue, 05 May 2009 04:38:34 -0500, Rodney <rodneyhoffman at gmail.com> wrote: > This (from some book) worked in Mathematica 4, but not now: > > - - - - - - - - - - - - > pic1 = Plot[8 Sin[Pi t] Exp[-t], {t, 0, 4}] > > plot4[p_] := Module[{R, p1, p2, p3}, > R[q_] := Show[q/.{x_, y_}:> {-y,x}]; > p1 = R[p]; p2 = R[p1]; p3 = R[p2]; > Show[p,p1,p2,p3] > ]; > > plot4[pic1] > > - - - - - - - - - - - - - > > I can't figure out how to do it today. Thanks for any suggestions. > > -- DrMajorBob at bigfoot.com
- References:
- programmatically rotating a function plot
- From: Rodney <rodneyhoffman@gmail.com>
- programmatically rotating a function plot