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

后端 未结 7 1797
[愿得一人]
[愿得一人] 2021-01-30 15:34

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} P

7条回答
  •  北恋
    北恋 (楼主)
    2021-01-30 15:54

    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]
    

提交回复
热议问题