我正在尝试修复BodePlot的Phase plot部分,因为它没有正确包装。我没有选择告诉它包装。
所以,而不是自己做完整的情节,(如果必须,我可以这样做)我正在考虑首先制作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]
答案 0 :(得分:6)
您可以尝试嵌套替换规则,例如
phase2 = phasePlot /.
Line[a_] :> (Line[a] /. {x_?NumericQ, y_?NumericQ} :> {x, Mod[y, 360, -180]});
Show[phase2, PlotRange -> {Automatic, {-180, 180}}, FrameTicks -> Automatic]
<强>输出:强>
答案 1 :(得分:3)
您要查找的列表似乎被Line[]
包裹,似乎是您的情节中唯一的情况。所以你可以使用
Cases[phasePlot, Line[list_] :> list, Infinity]
编辑: 当我发布我的回复时,页面刷新了,我看到你恰好遇到了我提出的建议。无论如何,我会把我的回复留在这里。
EDIT2:
Szabolics指出FullForm[]
没有效果,因此我将其从原始帖子中删除。