我尝试从这个图中删除Matlab给定的单位,但我找不到方法:
figure(1)
hold on
set(gcf,'PaperUnits','centimeters',...
'PaperSize',[15 9],...
'PaperPosition',[0 0 15 9]);
pzmap(LB); sgrid; grid on; axis equal;
title('');
xlabel('\sigma [rad/s]')
ylabel('\omega [rad/s]')
hold off
在此命令之后,xlabel
看起来像这样:\sigma [rad/s] (seconds^-1)
。秒数来自pzmap。我该如何删除它们?
我发现了一些奇怪的行为: 如果由图形图管理器生成代码,我得到:
% Create xlabel
xlabel('\sigma [rad/s] (seconds^{-1})','Units','pixels');
为什么???
现在我明白了 - 没有pzmap / pzplot
pol = pole(sys)
figure(1)
plot(real(pol(:)),imag(pol(:)),'x')
title('');
xlabel('\sigma [rad/s]');
ylabel('\omega [rad/s]');
sgrid
答案 0 :(得分:1)
pzmap
是一个高级便利功能,但它不是最好的选择(它也存储在R2013a的过时功能文件夹中,所以它可能会被标记为将来正式删除)。相反,让我们直接使用pzplot
创建一个示例图,而不是pzmap
。这仍然是一个情节功能,在幕后做了很多,但它返回一个句柄h
到情节:
sys = rss(3,2,2);
h = pzplot(sys);
sgrid;
axis equal;
我们可以通过pzplot
与getoptions
:
p = getoptions(h)
要根据需要设置标签和单位,可以尝试使用setoptions
:
p.Title.String = '';
p.XLabel.String = '\sigma';
p.YLabel.String = '\omega';
setoptions(h,p);
我相信绘图显示的'seconds -1 '的单位等于你想要指定的'rad / s'。我知道这两个看起来非常不同(我更喜欢我自己对弧度的具体说法),但是使用这样的情节函数试图为你做一切都是不利的。如果您想删除默认字符串或添加其他选项,则可能需要执行一些低级别的黑客攻击。一种更简单的方法,可能是在图形工具栏的“文件”菜单下使用“Generate Code...”命令(“旧版本中的”生成M文件...“)并编辑那里的图标(这个on the File Exchange也有一个编程选项。或者你可以输出到postscript并编辑它。
或者,您可以使用pzoptions
创建要传递给pzplot
或pzmap
的选项列表(在后一种情况下未记录):
p = pzoptions;
p.Title.String = '';
p.XLabel.String = '\sigma';
p.YLabel.String = '\omega';
sys = rss(3,2,2);
pzplot(sys,p);
sgrid;
axis equal;
在这种情况下,您会看到由于某种原因,文本大小要小得多。 pzplot
和pzmap
必须将字体大小设置为10。你可以很容易地做到这一点。
更多关于自定义此操作和相关控件工具箱图的信息,see this article。
答案 1 :(得分:0)
经过激烈的低级挖掘后,实际上有一种非常简单的方法来覆盖默认行为。
p = pzplot(sys);
p.AxesGrid.XUnits = 'rad/s';
p.AxesGrid.YUnits = 'rad/s';
更改似乎立即生效。我甚至尝试将值设置为空,即
p.AxesGrid.XUnits = '';
它有效地删除了单位烦人的括号。从技术上讲,matlab创建了一个自定义类元素,它们在resppack.mpzplot类实例中以AxesGrid的名称存储,具有一些标准的LTI行为。你可以通过“注入”一个与标准库函数同名的脚本来解决一些问题,这样它就会被调用,然后在那里改变一些东西,但这是我最接近删除它们的东西。烦恼的单位在几行。
作为辅助信息,初始化AxesGrid对象 ... \ controllib \图形\ @resppack \ @pzplot \ initialize.m 如果你想看看它。