20

This question has appeared in various forms online, but I have not yet seen a complete answer, so I am posting it here.

More specifically, suppose I have a function

F: X->Y

that is not one-to-one. Mathematica can easily plot this function as follows:

Plot[F[x], {x, 0, 30}, PlotRange -> {{0, 30}, {0, 1}}]

This produces a graph that passes the vertical line test, but does not pass the horizontal line test, because F is not one-to-one. My question is, how do I get a plot of the inverse relation (which is not a function) for all Y?

Edit: I am adding the function F for clarity. I originally omitted it because I figured a generic solution would solve it.

F[x_] := (1000 * x) / 24279 * Sqrt[-1 + x^(2/7)]

Edit 2: I am adding the graph (that I am trying to graph the inverse relation of) I produced using Plot for further clarity.

enter image description here

To be clear, this image is produced by the following three commands:

F[x_] := (1000 * x) / (24279 * Sqrt[-1 + x^(2/7)])
myplot = Plot[F[x], {x,0,30}, PlotRange -> {{0,30}, {0,1}}]
Export["foo.png", myplot]
merlin2011
  • 335
  • 1
  • 2
  • 7

3 Answers3

27

Update:

Using the example function provided in op's update:

ff[x_] := (1000*x)/(24279*Sqrt[-1 + x^(2/7)]);

prmtrcplt1 = ParametricPlot[{x, ff[x]}, {x, 0, 30}, PlotRange -> {{0, 30}, {0, 1}}, ImageSize -> 300, AspectRatio -> 1];

prmtrcplt2 = ParametricPlot[{ff[x], x}, {x, 0, 30}, PlotRange -> Reverse[PlotRange[prmtrcplt1]], ImageSize -> 300, AspectRatio -> 1];

Row[{prmtrcplt1, prmtrcplt2}, Spacer[5]]

enter image description here

plt = Plot[ff[x], {x, 0, 30}, PlotRange -> {{0, 30}, {0, 1}},ImageSize -> 300,
   AspectRatio -> 1];

ref1 = MapAt[GeometricTransformation[#, ReflectionTransform[{-1, 1}]] &, plt, {1}];

ref2 = plt /. line_Line :> GeometricTransformation[line, ReflectionTransform[{-1, 1}]];

Row[{plt, Graphics[ref1[[1]], PlotRange -> Reverse@PlotRange[ref1], ref1[[2]]], Graphics[ref2[[1]], PlotRange -> Reverse@PlotRange[ref2], ref2[[2]]]}, Spacer[5]]

enter image description here


original post

ParametricPlot (as suggested by whuber)

prmtrcplt1 = ParametricPlot[{x, x Sin[2 x]}, {x, -Pi, Pi},
   PlotRange -> {{-Pi, Pi}, {-3, 3}}, ImageSize -> 300];

prmtrcplt2 = ParametricPlot[{x Sin[2 x], x}, {x, -Pi, Pi}, PlotRange -> {{-Pi, Pi}, {-3, 3}}, ImageSize -> 300];

Row[{prmtrcplt1, prmtrcplt2}, Spacer[5]]

enter image description here

Post-process using ReflectionTransform

reflected = plt /. line_Line :> {Red,  
     GeometricTransformation[line, ReflectionTransform[{-1, 1}]]};

Row[{plt, reflected, Show[plt, Plot[x, {x, -Pi, Pi}, PlotStyle -> Black], reflected, PlotRange -> All, ImageSize -> 300]}, Spacer[5]]

enter image description here

Variations:

reflected2 = MapAt[GeometricTransformation[#, ReflectionMatrix[{-1, 1}]] &, plt, {1}];

reflected3 = MapAt[GeometricTransformation[#, ReflectionTransform[{-1, 1}]] &,plt, {1}]

kglr
  • 394,356
  • 18
  • 477
  • 896
  • ParametricPlot gives the error I mentioned above, RotationTransform as used above gives an empty graph, and I am trying ReflectionTransform. – merlin2011 Jan 29 '13 at 05:35
  • @merlin2011, just saw your update with the specific form of F; will check what is needed to change to handle that case. Btw, what is the value of z in your definition of F (or was it meant to be x)? – kglr Jan 29 '13 at 05:50
  • meant to be x, will fix. – merlin2011 Jan 29 '13 at 05:52
  • Can you apply the function Reverse in RelievePlot? I did unsuccessfully with Reverse[ReliefPlot[Cdata, PlotLegends -> Automatic, FrameTicks -> True, DataRange -> Automatic]]. – Léo Léopold Hertz 준영 Sep 23 '16 at 10:02
20

From an earlier answer of mine:

axisFlip = # /. {
     x_Line | x_GraphicsComplex :> MapAt[# ~Reverse~ 2 &, x, 1],
     x : (PlotRange -> _) :> x ~Reverse~ 2
   } &;

Example of use:

F[x_] := (1000*x)/(24279*Sqrt[-1 + x^(2/7)])
myplot = Plot[F[x], {x, 0, 30}, PlotRange -> {{0, 30}, {0, 1}}]

myplot // axisFlip

Mathematica graphics

One of the nice things about this method is the ability to easily use Filling:

Plot[{Sin[x], .5 Sin[2 x]}, {x, 0, 2 \[Pi]}, Filling -> {1 -> {2}}] // axisFlip

Mathematica graphics

Mr.Wizard
  • 271,378
  • 34
  • 587
  • 1,371
  • Your answer is wonderful! But the figure after axisFlip cannot Show with other figures. – Eden Harder Oct 28 '14 at 04:04
  • @EdenHarder It works fine here. Please try this example: g1 = Plot[{Sin[x], .5 Sin[2 x]}, {x, 0, 2 \[Pi]}, Filling -> {1 -> {2}}] // axisFlip; g2 = Plot[1 + 5 Sinc[10 x], {x, -1, 1}]; Show[g1, g2]. – Mr.Wizard Oct 28 '14 at 06:20
  • Please try this example: g1 = Plot[{Sin[x], .5 Sin[2 x]}, {x, 0, 2 \[Pi]}, Filling -> {1 -> {2}}] // axisFlip; g2 = Plot[1 + 5 Sinc[10 x], {x, -2, 2}, Filling -> Bottom]; Show[g1, g2, PlotRange -> {{-2, 2}, {0, 7}}] – Eden Harder Oct 28 '14 at 09:16
  • @Eden That works too, unless you are referring to the clipping in g2 which may be corrected by adding PlotRange -> All. Result: http://i.stack.imgur.com/9znY4.png Are you seeing something else? – Mr.Wizard Oct 28 '14 at 09:25
  • Yeah, it works! But why PlotRange -> All is needed? – Eden Harder Oct 29 '14 at 01:33
  • @Eden Regions outside the PlotRange are simply not rendered by Plot, therefore if it doesn't appear in g2 it cannot appear in Show[g1, g2] either. You cannot increase a PlotRange after-the-fact. Does that make sense? – Mr.Wizard Oct 29 '14 at 05:41
1

This is an ill formed sketch of an idea, but by allowing the output value of your function to be a set you can still maintain a 1 to 1 mapping.

Define a multi valued function:

g[x_] := {2 x} /; x < 10
g[x_] := {2 x, x} /; 10 <= x <= 20
g[x_] := {2 x, x, Sin@x} /; x > 20

A function to list plot a multi-valued function:

Clear@multiValueListPlot
multiValueListPlot[f_, {start_, stop_, step_: 100}] := 
 Function[{x, ys}, 
    Point[{x, #}] & /@ ys] @@@ ({#, f@#} & /@ 
     Range[start, stop, (stop - start)/step]) // Graphics

Show[multiValueListPlot[g, {1, 40, 300}], Frame -> True]

Mathematica graphics

For square roots:

Show[multiValueListPlot[y /. Solve[y^2 == #] &, {0, 40, 300}], 
 Frame -> True, FrameLabel -> {"X", "Square Roots"}]

Mathematica graphics

image_doctor
  • 10,234
  • 23
  • 40