Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mathematica: How to obtain data points plotted by plot command?

When plotting a function using Plot, I would like to obtain the set of data points plotted by the Plot command.

For instance, how can I obtain the list of points {t,f} Plot uses in the following simple example?

f = Sin[t]
Plot[f, {t, 0, 10}]

I tried using a method of appending values to a list, shown on page 4 of Numerical1.ps (Numerical Computation in Mathematica) by Jerry B. Keiper, http://library.wolfram.com/infocenter/Conferences/4687/ as follows:

f = Sin[t]
flist={}
Plot[f, {t, 0, 10}, AppendTo[flist,{t,f[t]}]]

but generate error messages no matter what I try.

Any suggestions would be greatly appreciated.

like image 292
Carey Avatar asked Mar 19 '11 18:03

Carey


People also ask

How do you find the points on a graph in Mathematica?

First, open the Drawing Tools palette from the Graphics menu: In the Drawing Tools palette, choose the Get Coordinates tool: When you hover over a graphic, the coordinates of the point under the cursor are displayed next to the cursor. Clicking a point marks the point in the graphic for later copying.

How do I extract a plot from Mathematica?

Select the graph by clicking the graph or the cell, then select File ▶ Save Selection As. In the Save As dialog box, select the file type in the Save as type: dropdown menu. Here, the graphic is saved as a JPEG: You can also simply use Copy and Paste to export a graphic.

What is plot command in Mathematica?

The "Plot" command in MATHEMATICAThe basic command for sketching the graph of a real-valued function of one variable in MATHEMATICA is. Plot[ f, {x,xmin,xmax} ] which will draw the graph of y=f(x) over the closed interval [xmin,xmax] on the x-axis.


2 Answers

f = Sin[t];
plot = Plot[f, {t, 0, 10}]

One way to extract points is as follows:

points = Cases[
   Cases[InputForm[plot], Line[___], 
    Infinity], {_?NumericQ, _?NumericQ}, Infinity];

ListPlot to 'take a look'

ListPlot[points]

giving the following:

enter image description here

EDIT Brett Champion has pointed out that InputForm is superfluous.

ListPlot@Cases[
  Cases[plot, Line[___], Infinity], {_?NumericQ, _?NumericQ}, 
  Infinity]

will work.

It is also possible to paste in the plot graphic, and this is sometimes useful. If,say, I create a ListPlot of external data and then mislay the data file (so that I only have access to the generated graphic), I may regenerate the data by selecting the graphic cell bracket,copy and paste:

ListPlot@Transpose[{Range[10], 4 Range[10]}]

points = Cases[
  Cases[** Paste_Grphic _Here **, Point[___], 
   Infinity], {_?NumericQ, _?NumericQ}, Infinity] 

Edit 2.

I should also have cross-referenced and acknowledged this very nice answer by Yaroslav Bulatov.

Edit 3

Brett Champion has not only pointed out that FullForm is superfluous, but that in cases where a GraphicsComplex is generated, applying Normal will convert the complex into primitives. This can be very useful.

For example:

lp = ListPlot[Transpose[{Range[10], Range[10]}], 
  Filling -> Bottom]; Cases[
 Cases[Normal@lp, Point[___], 
  Infinity], {_?NumericQ, _?NumericQ}, Infinity] 

gives (correctly)

{{1., 1.}, {2., 2.}, {3., 3.}, {4., 4.}, {5., 5.}, {6., 6.}, {7., 7.}, {8., 8.}, {9., 9.}, {10., 10.}}

Thanks to Brett Champion.

Finally, a neater way of using the general approach given in this answer, which I found here

The OP problem, in terms of a ListPlot, may be obtained as follows:

ListPlot@Cases[g, x_Line :> First@x, Infinity]

Edit 4

Even simpler

ListPlot@Cases[plot, Line[{x__}] -> x, Infinity]

or

ListPlot@Cases[** Paste_Grphic _Here **, Line[{x__}] -> x, Infinity]

or

ListPlot@plot[[1, 1, 3, 2, 1]]

This evaluates to True

plot[[1, 1, 3, 2, 1]] == Cases[plot, Line[{x__}] -> x, Infinity]
like image 85
681234 Avatar answered Oct 05 '22 12:10

681234


One way is to use EvaluationMonitor option with Reap and Sow, for example

In[4]:= 
(points = Reap[Plot[Sin[x],{x,0,4Pi},EvaluationMonitor:>Sow[{x,Sin[x]}]]][[2,1]])//Short

Out[4]//Short= {{2.56457*10^-7,2.56457*10^-7},<<699>>,{12.5621,-<<21>>}}
like image 22
Leonid Shifrin Avatar answered Oct 05 '22 11:10

Leonid Shifrin