Car*_*rey 13 wolfram-mathematica
当使用Plot绘制函数时,我想获得Plot命令绘制的数据点集.
例如,如何在以下简单示例中获取点的列表{t,f}?
f = Sin[t]
Plot[f, {t, 0, 10}]
Run Code Online (Sandbox Code Playgroud)
我尝试使用一种将值附加到列表的方法,如Jerry B. Keiper的Numerical1.ps(数学计算在Mathematica)第4页所示,http://library.wolfram.com/infocenter/Conferences/4687/ 如下:
f = Sin[t]
flist={}
Plot[f, {t, 0, 10}, AppendTo[flist,{t,f[t]}]]
Run Code Online (Sandbox Code Playgroud)
但无论我尝试什么,都会生成错误消息.
任何建议将不胜感激.
tom*_*omd 17
f = Sin[t];
plot = Plot[f, {t, 0, 10}]
Run Code Online (Sandbox Code Playgroud)
提取积分的一种方法如下:
points = Cases[
Cases[InputForm[plot], Line[___],
Infinity], {_?NumericQ, _?NumericQ}, Infinity];
Run Code Online (Sandbox Code Playgroud)
ListPlot'看看'
ListPlot[points]
Run Code Online (Sandbox Code Playgroud)
给出以下内容:
编辑
Brett Champion指出这InputForm
是多余的.
ListPlot@Cases[
Cases[plot, Line[___], Infinity], {_?NumericQ, _?NumericQ},
Infinity]
Run Code Online (Sandbox Code Playgroud)
将工作.
也可以粘贴在绘图图形中,这有时很有用.例如,如果我创建一个外部数据的ListPlot然后错误地放置数据文件(这样我只能访问生成的图形),我可以通过选择图形单元格括号来重新生成数据,复制并粘贴:
ListPlot@Transpose[{Range[10], 4 Range[10]}]
points = Cases[
Cases[** Paste_Grphic _Here **, Point[___],
Infinity], {_?NumericQ, _?NumericQ}, Infinity]
Run Code Online (Sandbox Code Playgroud)
编辑2.
我也应该交叉引用并承认Yaroslav Bulatov的这个非常好的答案.
编辑3
Brett Champion不仅指出这FullForm
是多余的,而且在GraphicsComplex
生成a的情况下,应用Normal
会将复合体转换为基元.这非常有用.
例如:
lp = ListPlot[Transpose[{Range[10], Range[10]}],
Filling -> Bottom]; Cases[
Cases[Normal@lp, Point[___],
Infinity], {_?NumericQ, _?NumericQ}, Infinity]
Run Code Online (Sandbox Code Playgroud)
给(正确)
{{1.,1.},{2.,2.},{3.,3.},{4.,4.},{5.,5.},{6.,6.},{ 7.,7.},{8.,8.},{9.,9.},{10.,10.}}
感谢Brett Champion.
最后,我在这里找到了一个更简洁的方法来使用这个答案中给出的一般方法
就ListPlot而言,OP问题可以如下获得:
ListPlot@Cases[g, x_Line :> First@x, Infinity]
Run Code Online (Sandbox Code Playgroud)
编辑4
更简单
ListPlot@Cases[plot, Line[{x__}] -> x, Infinity]
Run Code Online (Sandbox Code Playgroud)
要么
ListPlot@Cases[** Paste_Grphic _Here **, Line[{x__}] -> x, Infinity]
Run Code Online (Sandbox Code Playgroud)
要么
ListPlot@plot[[1, 1, 3, 2, 1]]
Run Code Online (Sandbox Code Playgroud)
这评估为 True
plot[[1, 1, 3, 2, 1]] == Cases[plot, Line[{x__}] -> x, Infinity]
Run Code Online (Sandbox Code Playgroud)
Leo*_*rin 14
一种方法是使用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>>}}
Run Code Online (Sandbox Code Playgroud)
除了Leonid的答案和我的后续评论中提到的方法之外,为了实时跟踪缓慢函数的绘制进度以查看正在发生的事情,您可以执行以下操作(使用最近这个问题的示例):
(* 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]
Run Code Online (Sandbox Code Playgroud)
等等
这是获取所有数据点的一种非常有效的方法:
{plot, {points}} = Reap @ Plot[Last@Sow@{x, Sin[x]}, {x, 0, 4 Pi}]
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
15735 次 |
最近记录: |