Kay,
If you do a normal plot that produces a -Graphics- object, then the First
part of that object contains all the graphics primitives and directives,
such as Line, Point, etc., that create the plotted object. The Last part
contains the overall plot options that control things such as the Frame,
PlotLabel etc.
ImplicitPlot is a little tricky because if you use the single iterator form
it produces -Graphics- output. If you use the double iterator form it
produces
-ContourGraphics-. You then have to convert that to Graphics.
So let's plot an ellipse with the single iterator form. I am going to use
colors later so will load the package now.
Needs["Graphics`Colors`"]
curves = First[
ImplicitPlot[x^2 + 2y^2 == 5, {x, -3, 3}, PlotPoints -> 20,
DisplayFunction -> Identity]];
We did an ImplicitPlot with the display suppressed, and took the first part.
This part contains the Lines that make up the curve. In general there will
be more than one Line. You could look at curves, but I won't display it
here. It contains two Lines.
Now we extract the points. The argument of each Line is just the points that
are used to plot the Line. So we can use...
pts = Cases[curves, Line[pts_] :> Point /@ pts, Infinity];
Now we can plot the curves and the points.
Show[Graphics[
{Tomato, curves,
Cobalt, AbsolutePointSize[4], pts}],
AspectRatio -> Automatic,
Frame -> True,
PlotLabel -> "Implicit Curve with Points",
Background -> Linen,
ImageSize -> 400
];
You can get the actual point coordinates for the two lines by...
pts /. Point -> Identity
which gives two lists of point coordinates for the lower and upper branches
of the ellipse.
If you use the two iterator form of ImplicitPlot, then you have to convert
it to Graphics before extracting the First part. Also, then Mathematica
embeds a color directive for each Line so if you want a colored line you
have to use PlotStyle. (If you don't specify a PlotStyle it embeds Black.)
So you would get the curves by the following statement. The rest would be
the same except that any color directive in the Show statement would not
affect the curves.
curves = First[
Graphics[ImplicitPlot[x^2 + 2y^2 == 5, {x, -3, 3}, {y, -2, 2},
PlotPoints -> 20, PlotStyle -> Tomato,
DisplayFunction -> Identity]]];
If you want to try the DrawGraphics package at my web site below you can
combine everything into one plot statement because the Draw routines
automatically convert to Graphics, extract the First part and suppress side
plots. You can also mix in curves produced by other types of plot
statements.
Needs["DrawGraphics`DrawingMaster`"]
Draw2D[
{Tomato,
curves = ImplicitDraw[x^2 + 2y^2 == 5, {x, -3, 3}, PlotPoints -> 20],
Cobalt, AbsolutePointSize[4],
pts = Cases[curves, Line[pts_] :> Point /@ pts, Infinity]},
AspectRatio -> Automatic,
Frame -> True,
PlotLabel -> "Implicit Curve with Points",
Background -> Linen,
ImageSize -> 400];
David Park
djmp at earthlink.net
http://home.earthlink.net/~djmp/
From: Kay Orgassa [mailto:Kay.Orgassa at gmx.de]
To: mathgroup at smc.vnet.net
Does anyone know, how to extract the data points from an ImplicitPlot?
Thanks, Kay