AlFagera
AlFagera

Reputation: 91

How to manage the legend for many plots

How do I handle this issue

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

The hold all command doesn't seem to be working properly. What can I do to fix this?

Upvotes: 1

Views: 421

Answers (2)

Suever
Suever

Reputation: 65460

You will want to set the DisplayName property of the plot. Then when you create the legend, the labels will automatically be populated.

plot(r, X, 'DisplayName', 'name')

Also, the string that you were passing to sprintf for your legends needs to be escaped becuase sprintf thinks that \z is a control character.

plot(r, X, 'DisplayName', sprintf('\\zeta = %0.1f',zeta(k)))

Also, hold on is recommended over hold all. Also, it is best practice to specify the axes handle when calling hold to ensure that it is applied to the current axes.

hold(hax, 'on')

So if we incorporate these changes into your plotting code (along with @R.Falque's idea to use 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');

enter image description here

Upvotes: 2

R.Falque
R.Falque

Reputation: 944

You can also use cells array as follow:

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);

Note that you have an error in the X definition (corrected from X(i,j) to X(j)).

enter image description here

Upvotes: 1

Related Questions