Mathematica: Как получить точки данных, построенные с помощью команды plot? - PullRequest
13 голосов
/ 19 марта 2011

При построении функции с использованием функции Plot я хотел бы получить набор точек данных, отображаемых с помощью команды Plot.

Например, как я могу получить список точек, которые {T, f} Plot использует в следующем простом примере?

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

Я попытался использовать метод добавления значений в список, показанный на странице 4 Numeric1.ps (Числовые вычисления в Mathematica) Джерри Б. Кейпера, http://library.wolfram.com/infocenter/Conferences/4687/ следующим образом:

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

но генерировать сообщения об ошибках независимо от того, что я пытаюсь.

Любые предложения будут с благодарностью.

Ответы [ 7 ]

16 голосов
/ 19 марта 2011
f = Sin[t];
plot = Plot[f, {t, 0, 10}]

Один из способов получения очков заключается в следующем:

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

ListPlot для «взгляда»

ListPlot[points]

с указанием следующего:

enter image description here

РЕДАКТИРОВАТЬ Бретт Чампион указал, что InputForm является излишним.

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

будет работать.

Также возможно вставить изображение графика, что иногда полезно.Если, скажем, я создаю ListPlot внешних данных, а затем теряю файл данных (чтобы у меня был только доступ к сгенерированному графику), я могу восстановить данные, выбрав скобку графической ячейки, скопировав и вставив:

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

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

Редактировать 2 .

Я должен был также дать перекрестные ссылки и признать этот очень хороший ответ Ярослава Булатова.

Редактировать 3

Бретт Чемпион не только указал, что FullForm является излишним, но что в случаях, когда генерируется GraphicsComplex, применяется Normalпревратит комплекс в примитивы.Это может быть очень полезно.

Например:

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

дает (правильно)

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

Благодаря Бретту Чэмпиону.

Наконец, более аккуратный способ использования общего подхода, приведенного в этом ответе, который я нашел здесь

Проблема ОП в терминах ListPlot может быть получена следующим образом:

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

Редактировать 4

Еще проще

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

или

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

или

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

Это оценивается как True

plot[[1, 1, 3, 2, 1]] == Cases[plot, Line[{x__}] -> x, Infinity]
14 голосов
/ 19 марта 2011

Одним из способов является использование опции EvaluationMonitor с Reap и Sow, например

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>>}}
9 голосов
/ 20 марта 2011

В дополнение к методам, упомянутым в ответ Леонида и мой дополнительный комментарий, для отслеживания хода выполнения медленных функций в режиме реального времени, чтобы увидеть, что происходит, вы можете сделать следующее (на примере это недавний вопрос):

(* CPU intensive function *)
LogNormalStableCDF[{alpha_, beta_, gamma_, sigma_, delta_}, x_] :=
 Block[{u},
  NExpectation[
   CDF[StableDistribution[alpha, beta, gamma, sigma], (x - delta)/u], 
   u \[Distributed] LogNormalDistribution[Log[gamma], sigma]]]

(* real time tracking of plot process *)
res = {};
ListLinePlot[res // Sort, Mesh -> All] // Dynamic

Plot[(AppendTo[res, {x, #}]; #) &@
  LogNormalStableCDF[{1.5, 1, 1, 0.5, 1}, x], {x, -4, 6}, 
 PlotRange -> All, PlotPoints -> 10, MaxRecursion -> 4]

enter image description here

enter image description here

enter image description here

и т. Д.

6 голосов
/ 07 ноября 2011

Вот очень эффективный способ получить все точки данных:

{plot, {points}} = Reap @ Plot[Last@Sow@{x, Sin[x]}, {x, 0, 4 Pi}]
4 голосов
/ 06 ноября 2011

Основываясь на ответе Sjoerd C. de Vries, я сейчас написал следующий код, который автоматизирует предварительный просмотр сюжета (протестировано на Mathematica 8):

pairs[x_, y_List]:={x, #}& /@ y
pairs[x_, y_]:={x, y}
condtranspose[x:{{_List ..}..}]:=Transpose @ x
condtranspose[x_]:=x
Protect[SaveData]
MonitorPlot[f_, range_, options: OptionsPattern[]]:=
  Module[{data={}, plot},
    Module[{tmp=#},
      If[FilterRules[{options},SaveData]!={},
        ReleaseHold[Hold[SaveData=condtranspose[data]]/.FilterRules[{options},SaveData]];tmp]]&@
    Monitor[Plot[(data=Union[data, {pairs[range[[1]], #]}]; #)& @ f, range,
                 Evaluate[FilterRules[{options}, Options[Plot]]]],
      plot=ListLinePlot[condtranspose[data], Mesh->All,
      FilterRules[{options}, Options[ListLinePlot]]];
      Show[plot, Module[{yrange=Options[plot, PlotRange][[1,2,2]]},
        Graphics[Line[{{range[[1]], yrange[[1]]}, {range[[1]], yrange[[2]]}}]]]]]]
SetAttributes[MonitorPlot, HoldAll]

В дополнение к показу прогрессаНа графике также отмечается позиция х, где он в настоящий момент рассчитывается.

Основная проблема заключается в том, что для нескольких графиков Mathematica применяет один и тот же стиль графика для всех кривых в конечном графике (что интересно, он невременные графики).

Чтобы получить данные, полученные в переменную dest, используйте параметр SaveData:>dest

3 голосов
/ 16 октября 2012

Просто посмотрите на структуру графика (для графиков другого типа будет немного другая структура) и используйте что-то вроде этого:

plt = Plot[Sin[x], {x, 0, 1}];
lstpoint = plt[[1, 1, 3, 2, 1]];
3 голосов
/ 20 марта 2011

Просто другой способ, возможно зависящий от реализации:

ListPlot@Flatten[
            Plot[Tan@t, {t, 0, 10}] /. Graphics[{{___, {_, y__}}}, ___] -> {y} /. Line -> List
         , 2]

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...