Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Dynamic Legend (Updates in every recursion)

I got a for i=1:15. Inside I generate a variable d=1:0.01:10, which is the x'x axis and based on this, I create a continuous function F(d) which has 2 unique variables pitch and yaw. I then plot this using different colors in every recursion using cmap = hsv(15);. So then it is:

d=1:0.01:10;
cmap = hsv(15);

for i=1:15
    pitch = unidrnd(10);
    yaw   = unidrnd(10);

    for j=1:length(d)
        F(j) = d(j)*3*pitch*yaw; %// some long calculation here
    end

    p1 = plot(d,F,'Linewidth', 1.0);
    title ('blah blah')
    set(p1, 'Color', cmap(i,:));
    hold on;
    legend (['pitch,yaw:', num2str(pitch) num2str(yaw)]) 
end 
hold off;

This code updates the unique pitch, yaw values in every recursion (without space between them so it is kind irritating) but fails to:

  1. Apply the proper color, visible in the figure.
  2. Hold the color from the previous iteration and the values of pitch,yaw.
like image 570
Kots Avatar asked Feb 10 '14 19:02

Kots


1 Answers

Semidocumented Solution

Adding lines to a legend in a loop can be accomplished with "dynamic legends", as described on undocumentedmatlab.com.

The idea is to replace the legend command with:

legend('-DynamicLegend');

Then update the plot command with a DisplayName parameter:

plot(d,F,'Linewidth',1.0,'DisplayName',sprintf('pitch,yaw: %d,%d',pitch,yaw));

Then plots that are added to the axes get added to the legend:

enter image description here

If semi-documented features are not your cup of tea, use the DisplayName trick and simply toggle the legend off/on. That is, instead of -DynamicLegend:

legend('off'); legend('show');

A different variation that does not use either DisplayName or -DynamicLegend is to delete and recreate the legend with an array of stored strings.

Official Solution

The official solution recommended by MathWorks it so grab the existing legends` line handles and manually update the legend with those handles. This is pretty painful by comparison to the dynamic legend solution above:

% Get object handles
[LEGH,OBJH,OUTH,OUTM] = legend;

% Add object with new handle and new legend string to legend
legend([OUTH;p1],OUTM{:},sprintf('pitch,yaw: %d,%d',pitch,yaw))
like image 134
chappjc Avatar answered Oct 14 '22 00:10

chappjc