Wolfram mathematica 如何仅从BodePlot图中提取数据点?

Wolfram mathematica 如何仅从BodePlot图中提取数据点?,wolfram-mathematica,Wolfram Mathematica,我正在尝试修复BodePlot的相位图部分,因为它没有正确包装。我也没有办法告诉它包装 因此,与其自己做完整的绘图,(如果有必要的话,我可以这样做)我想先做一个BodePlot,抓取数据点,对数据进行包装(一旦我得到x,y数据,其余的都很容易),然后我需要将新的点列表放回绘图中,然后使用Show来显示它 我被困的部分是从FullForm中提取点。我找不到正确的模式来做那件事 这就是我到目前为止要说的: hz=z/(z^2-z+0.3); tf=TransferFunctionModel[hz,z

我正在尝试修复BodePlot的相位图部分,因为它没有正确包装。我也没有办法告诉它包装

因此,与其自己做完整的绘图,(如果有必要的话,我可以这样做)我想先做一个BodePlot,抓取数据点,对数据进行包装(一旦我得到x,y数据,其余的都很容易),然后我需要将新的点列表放回绘图中,然后使用Show来显示它

我被困的部分是从FullForm中提取点。我找不到正确的模式来做那件事

这就是我到目前为止要说的:

hz=z/(z^2-z+0.3);
tf=TransferFunctionModel[hz,z,SamplingPeriod->2];
phasePlot=BodePlot[tf,{0.001,2 Pi},
       ScalingFunctions->{Automatic,{"Linear","Degree"}},PlotLayout->"List"][[2]]

您可以看到它是如何不以180度角缠绕的。在dsp中更常见的是Bode相位图。下面是它“应该”的样子:

这就是我所做的:

 FullForm[phasePlot]
Graphics[List[
  List[List[], List[], 
   List[Hue[0.67, 0.6, 0.6], 
    Line[List[List[0.0010000243495554542, -0.2673870119911639], 
      List[0.0013659538057574799, -0.36521403872250247], 
      List[0.0017318832619595053, -0.46304207336414027],
      ....
我在那里看到了数据(x,y),但是如何提取它们呢?我试过这个:

  Cases[FullForm[phasePlot], List[x_, y_] -> {x, y}, Infinity];
但是上面的匹配除了点列表之外,其他我不需要的东西。 我尝试了很多其他的方法,但只能得到一系列的要点

我想知道是否有人知道如何从上面的图中只提取(x,y)点。除了使用FullForm,还有更好的方法吗

谢谢

更新:

我刚刚找到一篇文章,展示了如何从绘图中提取数据。所以我用了它:

   points = Cases[Normal@phasePlot, Line[pts_] -> pts, Infinity]

例如,您可以尝试嵌套替换规则

phase2 = phasePlot /. 
    Line[a_] :> (Line[a] /. {x_?NumericQ, y_?NumericQ} :> {x, Mod[y, 360, -180]});
Show[phase2, PlotRange -> {Automatic, {-180, 180}}, FrameTicks -> Automatic]
输出:


您要查找的列表似乎被
行[]
环绕,这似乎是绘图中的唯一情况。所以你可以用

Cases[phasePlot, Line[list_] :>  list, Infinity]
编辑: 当我发布我的回复时,页面刷新了,我看到你正好看到了我的建议。无论如何,我会把我的回复贴在这里

编辑2:
Szabolics指出,
FullForm[]
无效,因此我将其从我的原始帖子中删除。

FullForm
用于打印带有特殊格式的表达式,在这种情况下它没有任何用处。您可能需要
Normal
来扩展任何
GraphicsComplex
对象。澄清一下:通常,
FullForm
或任何
*Form
函数都不会对表达式进行任何结构修改。它们只会影响打印的方式。您看到的和内核看到的并不总是相同的。@Szabolics。感谢您对
FullForm
的澄清。我现在把它从我的帖子中删除了。我想你是误解了
FullForm
。见我对大卫回答的评论。(我刚刚注意到你在问题中也使用了
FullForm
)我没有Mma 8,所以我不知道BodePlot。然而,Andrew Moylan(参见)指出,
EvaluationMonitor
,连同Sow/Reap,可用于从
绘图
中“干净地”提取数据点。这可能很有用。例如,以下计算结果为True<代码>排序/@Last@eaw[Plot[Sin[x],{x,0,4pi},EvaluationMonitor:>Sow[{x,Sin[x]}]==Cases[Plot[Sin[x],{x,0,4pi}],x_行:>First@x,无穷大]