如何管理多个地块的图例
How to manage the legend for many plots
我该如何处理这个问题
clear all; close all; clc;
r = 0:5;
zeta = 0:0.1:1;
for i = 1:size(zeta(:))
for j = 1:size(r(:))
X(i,j) = sqrt((1+(2*zeta(i)*r(j))^2)/((1-r(j)^2)^2+ (2*zeta(i)*r(j))^2));
end
plot(r,X);
xlabel('r = \omega/\omega_n');
ylabel('M = \frac{X}{Y}');
hold all
grid
[~,~,~,current_entries] = legend;
legend([current_entries {sprintf('\zeta = %i',zeta(i))}]);
end
figure
plot(r,X)
grid
hold all
命令似乎没有正常工作。我该怎么做才能解决这个问题?
您将要设置情节的 DisplayName
属性。然后当您创建 legend
时,标签将自动填充。
plot(r, X, 'DisplayName', 'name')
此外,您传递给 sprintf
的字符串需要转义,因为 sprintf
认为 \z
是控制字符。
plot(r, X, 'DisplayName', sprintf('\zeta = %0.1f',zeta(k)))
此外,hold on
优于 hold all
。此外,最佳做法是在调用 hold
时指定坐标区句柄,以确保将其应用于当前坐标区。
hold(hax, 'on')
因此,如果我们将这些更改合并到您的绘图代码中(以及 @R.Falque 使用 semilogy
的想法)
r = 0:0.001:5;
zeta = 0:0.1:1;
hax = axes();
colors = hsv(numel(zeta));
for k = 1:numel(zeta)
X = sqrt((1 + (2 * zeta(k) * r).^2) ./ ((1-r.^2).^2+ (2*zeta(k)*r).^2));
semilogy(r, X, ...
'DisplayName', sprintf('\zeta = %0.1f',zeta(k)), ...
'Color', colors(k,:));
hold(hax, 'on')
end
grid(hax, 'on')
xlabel(hax, 'r = \omega/\omega_n', 'Interpreter', 'tex');
ylabel(hax, 'M = $\displaystyle\frac{X}{Y}$', 'Interpreter', 'latex');
L = legend('show');
您还可以按如下方式使用元胞数组:
clear all; close all; clc;
r = 0:0.001:5;
zeta = 0:0.1:1;
figure;
for i = 1:length(zeta)
for j = 1:length(r)
X(j) = sqrt((1+(2*zeta(i)*r(j))^2)/((1-r(j)^2)^2+ (2*zeta(i)*r(j))^2));
end
semilogy(r,X);
hold on
legend_string{i} = ['\zeta = ', num2str(zeta(i))];
end
hold off
grid
xlabel('r = \omega/\omega_n');
ylabel('M = $\frac{X}{Y}$','Interpreter', 'Latex');
legend(legend_string);
请注意,您在 X
定义中有错误(已从 X(i,j)
更正为 X(j)
)。
我该如何处理这个问题
clear all; close all; clc;
r = 0:5;
zeta = 0:0.1:1;
for i = 1:size(zeta(:))
for j = 1:size(r(:))
X(i,j) = sqrt((1+(2*zeta(i)*r(j))^2)/((1-r(j)^2)^2+ (2*zeta(i)*r(j))^2));
end
plot(r,X);
xlabel('r = \omega/\omega_n');
ylabel('M = \frac{X}{Y}');
hold all
grid
[~,~,~,current_entries] = legend;
legend([current_entries {sprintf('\zeta = %i',zeta(i))}]);
end
figure
plot(r,X)
grid
hold all
命令似乎没有正常工作。我该怎么做才能解决这个问题?
您将要设置情节的 DisplayName
属性。然后当您创建 legend
时,标签将自动填充。
plot(r, X, 'DisplayName', 'name')
此外,您传递给 sprintf
的字符串需要转义,因为 sprintf
认为 \z
是控制字符。
plot(r, X, 'DisplayName', sprintf('\zeta = %0.1f',zeta(k)))
此外,hold on
优于 hold all
。此外,最佳做法是在调用 hold
时指定坐标区句柄,以确保将其应用于当前坐标区。
hold(hax, 'on')
因此,如果我们将这些更改合并到您的绘图代码中(以及 @R.Falque 使用 semilogy
的想法)
r = 0:0.001:5;
zeta = 0:0.1:1;
hax = axes();
colors = hsv(numel(zeta));
for k = 1:numel(zeta)
X = sqrt((1 + (2 * zeta(k) * r).^2) ./ ((1-r.^2).^2+ (2*zeta(k)*r).^2));
semilogy(r, X, ...
'DisplayName', sprintf('\zeta = %0.1f',zeta(k)), ...
'Color', colors(k,:));
hold(hax, 'on')
end
grid(hax, 'on')
xlabel(hax, 'r = \omega/\omega_n', 'Interpreter', 'tex');
ylabel(hax, 'M = $\displaystyle\frac{X}{Y}$', 'Interpreter', 'latex');
L = legend('show');
您还可以按如下方式使用元胞数组:
clear all; close all; clc;
r = 0:0.001:5;
zeta = 0:0.1:1;
figure;
for i = 1:length(zeta)
for j = 1:length(r)
X(j) = sqrt((1+(2*zeta(i)*r(j))^2)/((1-r(j)^2)^2+ (2*zeta(i)*r(j))^2));
end
semilogy(r,X);
hold on
legend_string{i} = ['\zeta = ', num2str(zeta(i))];
end
hold off
grid
xlabel('r = \omega/\omega_n');
ylabel('M = $\frac{X}{Y}$','Interpreter', 'Latex');
legend(legend_string);
请注意,您在 X
定义中有错误(已从 X(i,j)
更正为 X(j)
)。