【发布时间】: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]