【问题标题】:How to extract only the data points from BodePlot plot?如何仅从 BodePlot 图中提取数据点?
【发布时间】:2011-07-27 07:24:06
【问题描述】:

我正在尝试修复 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 中更常见的是波德相位图包装。这是它“应该”的样子:

所以,这就是我所做的:

 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 之外,还有更好的方法吗?

谢谢

更新:

我刚刚找到一个帖子here,它展示了如何从绘图中提取数据。所以我用了它:

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

【问题讨论】:

  • 我认为你误解了FullForm。在大卫的回答中查看我的 cmets。 (我刚刚注意到您在问题中也使用了FullForm。)
  • 我没有 Mma 8,所以我不知道 BodePlot。然而,Andrew Moylan(参见here)指出EvaluationMonitor 与Sow/Reap 一起可用于“干净”地从Plot 中提取数据点。这可能很有用。例如,以下计算结果为 True。 Sort /@ Last@ Reap[Plot[Sin[x], {x, 0, 4 Pi}, EvaluationMonitor :> Sow[{x, Sin[x]}]]] == Cases[Plot[Sin[x], {x, 0, 4 Pi}], x_Line :> First@x, Infinity]

标签: wolfram-mathematica


【解决方案1】:

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

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

输出:

【讨论】:

    【解决方案2】:

    您要查找的列表似乎由Line[] 包裹,并且它似乎是您的情节中的唯一案例。所以你可以使用

    Cases[phasePlot, Line[list_] :>  list, Infinity]
    

    编辑: 当我发布我的回复时,页面刷新了,我看到您完全符合我的建议。无论如何,我都会在此处发布我的回复。

    编辑2: Szabolics 指出 FullForm[] 没有任何作用,因此我将其从我的原始帖子中删除。

    【讨论】:

    • FullForm 用于打印具有特殊格式的表达式,它在Cases 中没有任何用处。您可能需要的是Normal 来扩展任何GraphicsComplex 对象。
    • 澄清:一般来说,FullForm 或任何*Form 函数从不对表达式进行任何结构修改。它们只会影响它的打印方式。你看到的和内核看到的并不总是一样的。
    • @Szabolics。感谢您对FullForm 的澄清。我现在把它从我的帖子中删除了。
    猜你喜欢
    • 2012-04-08
    • 2021-12-16
    • 2016-11-15
    • 2012-02-14
    • 2015-09-23
    • 1970-01-01
    • 2019-06-25
    相关资源
    最近更新 更多