关于Matlab:多个图的pzmap或pzplot颜色句柄

pzmap or pzplot color handle for multiple plots

我正在使用pzmap.m或pzplot.m中的任意一个绘制系统的闭环极点。我想在更改由L表示的变量时看到极点和零点的运动。

该功能没有直接处理颜色的功能。在示例中,您只能选择标准颜色,而不能给出自己的颜色。由于必须在同一图形上绘制多次,因此我为for循环中的每次迭代创建一个句柄,并使用findobj设置曲线的颜色。要获得颜色,我要有一个颜色栏。因此,我使用jet来获取图形的颜色分布。但是市场规模保持不变,而且我有一个难看的数字。

MWE:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cb=jet(10);
s=tf('s');
L_array=5:5:50;

figure; hold on;
for i=1:length(L_array)
    L=L_array(i);
    G=((58.2+11.7*L)*s^2*25^2+(3996.8 + 815.7*L)*s*25+815.7*25^2)/(s^2*(s^2*25^2+126.9*s*25+(3996.8+1.9*25^2)));
    CL=feedback(G,1);
    pzmap(CL);
    h = findobj(gcf,'type','point'); set(h,'markers',12,'color',cb(i,:));
    clear L G CL h
end
grid;
c=colorbar
c.Label.String = 'L'

如果运行它,您会发现大小没有变化,并且图形的两端都带有y标记的y轴看起来很疯狂。我想要一个合适的颜色条,从蓝色到红色,并且颜色分布正确,但是多次尝试后却无法获得它。如果我可以减少混乱,那也会有所帮助。


您的代码中有几个问题

  • h = findobj(gcf,'type','point');屏幕上绘制的内容实际上是'line'类型的!
  • 每次迭代,您都将捕获所有要点,并在清除属性后清除它们,然后对其进行暗中修改。

此外,h = findobj(gcf,'type','line');不会返回单个内容,而是返回一组内容,因此您需要对其进行索引以设置属性。我修改后的代码工作如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
clear;clc
cb=parula(10);
s=tf('s');
L_array=5:5:50;

figure; hold on;
for i=1:length(L_array)
    L=L_array(i);
    G=((58.2+11.7*L)*s^2*25^2+(3996.8 + 815.7*L)*s*25+815.7*25^2)/(s^2*(s^2*25^2+126.9*s*25+(3996.8+1.9*25^2)));
    CL=feedback(G,1);
    pzmap(CL);

end

% lets do this in the end!

% you will have length(L_array)*2 +1 items in h
 h = findobj(gca,'type','line');
for jj=2:length(h)
        set(h(jj),'MarkerSize',12,'Color',cb(floor(jj/2),:));
end
grid;

colormap(parula);   % I am using parula, you can use jet, but I discourage it
c=colorbar;

enter image description here

PD:有很多原因不使用jet!请使用可感知的统一颜色图!