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](https://istack.dev59.com/E2dMx.gif)
编辑:
Brett Champion 指出
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.
我还应该交叉参考并承认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.}}
感谢Brett Champion。
最后,这个答案中提供的通用方法更加简洁易懂,我在这里找到了它。
将原问题转换为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]
Plot
函数中使用AppendTo
作为第三个参数是不支持的语法。我刚刚查看了你提到的19年前的论文(时间过得真快,如果你玩得开心),它使用了类似于我下面使用的复合语法。 - Sjoerd C. de Vries