Re: Contour Plot

*To*: mathgroup at smc.vnet.net*Subject*: [mg5805] Re: Contour Plot*From*: Robert Villegas <villegas>*Date*: Wed, 22 Jan 1997 00:44:12 -0500*Sender*: owner-wri-mathgroup at wolfram.com

> I use the command: > > ContourPlot[f,{x,0,1000},{y,0,1000},Contours->{0}] > > i.e, find f=0 > > How can I get the locations {{x1,y1},{x2,y2},{x3,y3},.....{xn,yn}} > when f=0? Here is a reply I sent to essentially the same query that came up in March of last year. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - In article <4h3l3v$1od at dragonfly.wolfram.com> easther at cfi.waseda.ac.jp (Richard Easther) writes: > Can someone help me with the following problem. After doing a > > figure = ContourPlot[f[x,y], ..., Contours ->{0}], > > I want to extract the set of points actually plotted - ie a set of {x,y} > where f[x,y] == 0 for some additional processing. > > The command TextForm[InputForm[Graphics[ figure ]]] gives me a text > string which has a series of Line commands that actually contains the > {x,y} values that are plotted. > > Now what I want to know is this: can someone tell me a nice (or even > ugly but workable!) way of extracting the list(s) of points plotted by > the Line command(s)? You're most of the way there with Graphics[figure]. That contains the Line objects, as you noted, so all that's left to do is extract them: contourLines = Cases[Graphics[figure], _Line, -1] This returns a list of Line objects that comprise the level curve z = 0. There might be more than one if the contour is disconnected (at least, disconnected in the rectangle in which f was originally plotted), or none. And if you want a different level curve z = z0 later on, just Show 'figure' again with a different Contours setting. contourLines = Cases[Show[figure, Contours->{z0}, DisplayFunction->Graphics, ContourShading->False], _Line, -1] DisplayFunction->Graphics causes the new contour plot to be converted straight to Graphics without being displayed, and ContourShading->False causes the shaded Polygon's to be left out of the Graphics object, since they are baggage unimportant to calculating the contour lines. If you actually do want a new graph displayed for every new contour computed, use Graphics @ Show[figure, Contours->{z0}] as the first argument of Cases instead. Here is a general function LevelCurve that returns a rule z -> {Line, ...} for each contour you ask for. ExtractLines[cgraph_ContourGraphics] := Cases[Show[cgraph, ContourShading->False, DisplayFunction->Graphics], _Line, -1] LevelCurve[cgraph_ContourGraphics, z_List] := (# -> Show[cgraph, Contours->{#}, DisplayFunction->ExtractLines] )& /@ z LevelCurve[cgraph_ContourGraphics, z_] := First @ LevelCurve[cgraph, {z}] Example: In[5]:= cplot = ContourPlot[Arg @ AiryAi[x + y I], {x, 3, 5}, {y, -4, -2}, PlotPoints->40] Out[5]= -ContourGraphics- In[6]:= LevelCurve[cplot, 5/6 Pi] 5 Pi Out[6]= ---- -> 6 > {Line[{{5., -3.82523}, {4.94872, -3.84198}, {4.93604, -3.84615}, > {4.89744, -3.85893}, {4.84615, -3.87607}, {4.79487, -3.89341}, > {4.78304, -3.89744}, {4.74359, -3.91095}, {4.69231, -3.92869}, > {4.64103, -3.94665}, {4.63515, -3.94872}, {4.58974, -3.96481}, > {4.53846, -3.98319}, {4.49209, -4.}}]} Robby Villegas