Search code examples
matlabplotmatlab-figure

Draw over legend in a Matlab figure


I would like to place an arrow over a legend in a matlab plot but when I add the arrow, the legend defaults to being "on top" (see the picture, the black line being covered by the legend).

Is there a way to push a subfigure, such as an arrow, to the "top" so that it appears over all other component of the figure, including the legend? I've tried to use uistack but that doesn't seem to work with legends. uistack as the doc says should "Reorder visual stacking of UI components".

edit:

Very simple example: the line that I'm drawing should appear on top of the legend.

figure;
b = bar(1:3,rand(3));
hold on;
p = plot([0,3],[0,.5],'Color','k','linewidth',1.5); % my arrow
l = legend(b,'value','Location','SouthWest','AutoUpdate','off');
uistack(l,'bottom');

enter image description here


Solution

  • You can copyobj the current graphical axes gca and set its Color property to none. This method will draw the line over the legend's patches and associated texts.

    Explanation : Copyobj will copy and display all the axes related to the bar and line but not the legend (legends have axes on their own). The display of the copied axes will overlay perfectly with the original one. And 'Color','none' makes the white background of the copied axes transparent, thus making the legend visible again but visible under the line.

    Here is the code

    f = figure;
    b = bar(1:3,rand(3));
    hold on;
    p = plot([0,3],[0,.5],'Color','k','linewidth',1.5); % my arrow
    l = legend(b, 'Location','SouthWest');
    
    % add some magic
    hax = copyobj(gca, f); % copy the current axes to the figure
    set(hax, 'Color', 'none') % set the new axes's background transparent
    

    enter image description here