Wolfram mathematica Mathematica:如何获得通过plot命令绘制的数据点?

Wolfram mathematica Mathematica:如何获得通过plot命令绘制的数据点?,wolfram-mathematica,Wolfram Mathematica,使用Plot绘制函数时,我希望获得Plot命令绘制的数据点集 例如,在下面的简单示例中,如何获得点{t,f}Plot使用的列表 f = Sin[t] Plot[f, {t, 0, 10}] 我尝试使用Jerry B.Keiper在Numerical1.ps(Mathematica中的数值计算)的第4页中所示的将值附加到列表的方法,如下所示: f = Sin[t] flist={} Plot[f, {t, 0, 10}, AppendTo[flist,{t,f[t]}]] points = C

使用Plot绘制函数时,我希望获得Plot命令绘制的数据点集

例如,在下面的简单示例中,如何获得点{t,f}Plot使用的列表

f = Sin[t]
Plot[f, {t, 0, 10}]
我尝试使用Jerry B.Keiper在Numerical1.ps(Mathematica中的数值计算)的第4页中所示的将值附加到列表的方法,如下所示:

f = Sin[t]
flist={}
Plot[f, {t, 0, 10}, AppendTo[flist,{t,f[t]}]]
points = Cases[
   Cases[InputForm[plot], Line[___], 
    Infinity], {_?NumericQ, _?NumericQ}, Infinity];
ListPlot@Cases[g, x_Line :> First@x, Infinity]
但无论我尝试什么,都会生成错误消息


任何建议都将不胜感激。

例如,一种方法是将
评估监控
选项与
收获
播种
一起使用

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>>}}
[4]中的
:=
(points=reaw[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},,{12.5621,-}
提取点的一种方法如下所示:

f = Sin[t]
flist={}
Plot[f, {t, 0, 10}, AppendTo[flist,{t,f[t]}]]
points = Cases[
   Cases[InputForm[plot], Line[___], 
    Infinity], {_?NumericQ, _?NumericQ}, Infinity];
ListPlot@Cases[g, x_Line :> First@x, Infinity]
ListPlot以“查看”

ListPlot[points]
提供以下信息:

编辑 Brett Champion指出,
InputForm
是多余的

ListPlot@Cases[
  Cases[plot, Line[___], Infinity], {_?NumericQ, _?NumericQ}, 
  Infinity]
会有用的

也可以粘贴到绘图图形中,这有时很有用。例如,如果我创建了外部数据的列表图,然后错误地显示了数据文件(因此我只能访问生成的图形),我可以通过选择图形单元格括号、复制和粘贴来重新生成数据:

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

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

我还应该交叉引用雅罗斯拉夫·布拉托夫(Yaroslav Bulatov)非常好的回答

编辑3

Brett Champion不仅指出
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.}

感谢布雷特冠军

最后,我发现了一种更简洁的方法来使用这个答案中给出的一般方法

根据列表图,OP问题可通过以下方式获得:

f = Sin[t]
flist={}
Plot[f, {t, 0, 10}, AppendTo[flist,{t,f[t]}]]
points = Cases[
   Cases[InputForm[plot], Line[___], 
    Infinity], {_?NumericQ, _?NumericQ}, Infinity];
ListPlot@Cases[g, x_Line :> First@x, Infinity]
编辑4

更简单

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

计算结果为
True

plot[[1, 1, 3, 2, 1]] == Cases[plot, Line[{x__}] -> x, Infinity]

除了在和我的后续评论中提到的方法外,要实时跟踪慢速函数的绘图进度以查看发生了什么,您可以执行以下操作(使用最近的问题示例):


等等。

另一种方式,可能取决于实现:

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

根据Sjoerd C.de Vries的回答,我现在编写了以下代码,用于自动进行绘图预览(在Mathematica 8上测试):

除了显示绘图进度外,它还标记当前计算的x位置

主要问题是,对于多个绘图,Mathematica对最终绘图中的所有曲线应用相同的绘图样式(有趣的是,它不适用于临时绘图)


要将生成的数据获取到变量
dest
,请使用选项
SaveData:>dest
以下是获取所有数据点的非常有效的方法:

{plot, {points}} = Reap @ Plot[Last@Sow@{x, Sin[x]}, {x, 0, 4 Pi}]

只需查看图的结构(对于不同类型的图,会有一点不同的结构),并使用如下内容:

plt = Plot[Sin[x], {x, 0, 1}];
lstpoint = plt[[1, 1, 3, 2, 1]];

InputForm
是不必要的,但是如果您无法控制绘图的来源,可以将其替换为
Normal
。例如,如果添加填充选项,绘图将包含
GraphicsComcplex
,点将只是全局点集的整数引用。@Brett Champion谢谢!我从未意识到,
InputForm
是多余的。我做了相应的编辑。我通常在提取数据之前“看一看”。(通常是一种策略本身)你能举个例子说明GraphicsComplex会给出整数引用吗<代码>f=Sin[t];plotfill=Plot[f,{t,0,10},Filling->Axis];ListPlot@Cases[例如,案例[plot,GraphicsComplex[\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。谢谢你的评论。<代码>列表图[{1,2},填充->底部]包含以下图形复杂以下的图形:代码>图形复杂以下的图形复杂以下的图形:代码>图形复杂以下的图形复杂以下的图形复杂:<代码>图形复杂[{{1,1,1,1,1,1,1,1,0.1,1,0.1,1,{1,2,2,2},底部]<列表>列表<代码>列表<代码>列表<代码>列表中包括包括以下的以下的图形复杂以下的图形复杂以下的图形复杂以下的图形复杂:<代码:<代码>图形复杂[{{{1,1,1,1,1,1.1,1,1.1,1.1,1.1.1,1.1.1.1.1.1.1,,{1,1,1,},{1.1,1.1,{1,{1,{1 6],点[{5,6}]},{}]。
线[{4,2}]
意味着我们正在从第四点(
{2,0}
)到第二点(
{2,2}
)。@Brett Champion再次感谢!很抱歉,我一开始没有注意到您关于
Normal
以及如何使用
GraphicsComplex
GraphicsComplex拆分为原语的问题<代码>案例[案例][Normal@ListPlot[{1,2},Filling->Bottom],Point[\uuuuuuuuuiq],Infinity],{{uuuuiq,{uuuuuiq},Infinity]
将从您给出的示例中提取(两个)数据点。省略它,或用
FullForm
替换它将不起作用。很高兴知道这一点,再次感谢!对于EvaluationMonitor不可用的任何情况,您都可以使用复合语句,例如:
{plot,{points}}=reaw[plot[Sow[x];Sin[x],{x,0,4pi}]请注意,在这种特殊情况下,应删除前两点,因为它们不属于数值计算循环的一部分。@Sjoerd我是第二个。我在这篇文章中实际使用了这个方法:。但是,由于我假设OP看到了这个答案,并且由于
EvaluationMonitor
允许避免这一步骤,并且可能在可用时通常更“干净”,所以我在这里使用了它。
EvaluationMonitor:>Sow[{x,Sin[x]}]
需要在每个点对目标函数进行额外的评估。看我的答案更有效