How do I skip items in a legend?
Mostrar comentarios más antiguos
How do I skip items in legend? Say I have 6 plots with 3 actual values and 3 interpolated curves. I only want to label the actual value curves so
legend('first','','second','','third')
doesn't really work because the interpolated curve still shows.
14 comentarios
EhsanZ
el 12 de Mzo. de 2018
1- Select the curve you don't want have legend. 2- Go to the "more properties" (while the curve is still selected). 3- Turn "HandleVisibility" off.
FTil
el 16 de Jun. de 2018
Or programmatically:
plot(...,'HandleVisibility','off')
Akash Menon
el 13 de Dic. de 2018
figure
h1=histfit(no_ess,20,'gamma');
xlim([0 1])
hold on
h2=histfit(with_ess,50,'kernel');
xlim([0 1])
set(get(get(h1(2),'Annotation'),'LegendInformation'),'IconDisplayStyle','off');
set(get(get(h2(2),'Annotation'),'LegendInformation'),'IconDisplayStyle','off');
legend('MCR SOL','MCR SOL ESS')
Here's a quick sample of how it worked- for my histograms I didn't want the two red lines to be labelled in the legend. I found out that for the histograms- it creates a handle h(1) and (2) where 1 corresponds to the bar charts and 2 to the fitting lines.
Just an example- hope it helps!

neurosock hardcore BCIs
el 27 de En. de 2021
Editada: neurosock hardcore BCIs
el 27 de En. de 2021
The nice thing about 'HandleVisibility' in contrast to 'IconDisplayStyle' is that it can be called directly in the function of plots and patches:
plot(...,'HandleVisibility','off')
patch(...,'HandleVisibility','off')
Dandro18048
el 6 de Abr. de 2021
@FTil I was looking exactly for this, thank you very much! Simplest solution of everything that's been posted here.
Giuseppe Degan Di Dieco
el 15 de Jun. de 2021
Dear Akash,
thanks for your tip, hope you're still reagind these days.
It really helped me in avoid plotting one of two labels in a stacked bar plot.
Best.
Rik
el 15 de Jun. de 2021
@Giuseppe Degan Di Dieco, regarding your flag ("Really helpful, and easy to code because of the set and get commands!"): flags are used to attract the attention of site admins and users with editing privileges. They should not be used as personal bookmarks.
Giuseppe Degan Di Dieco
el 16 de Jun. de 2021
Sorry then, if there is a way for removing it, please let me know, and I will amend it.
I will bear in mind for the future.
Best.
Rik
el 16 de Jun. de 2021
No problem. I have already removed the flag.
Giuseppe Degan Di Dieco
el 29 de Jul. de 2021
Hi Rik,
thanks for your work.
Best.
Christian Busse
el 19 de Ag. de 2021
Hello,
the changes made in MATLAB 2021a do not produced expected/desired results. Using
leg = legend('first','second','third')
leg.String(2) = ''
does not skip producing a legend label for the second curve but rather assigns the label 'third' to the second curve.
I couldn't find any hint in the documentation how to actually skip/remove legend labels for particular curves and keep the others as is.
Christian Busse
el 19 de Ag. de 2021
Ok this workaround found in the comments below, actually solved my problem:
legend([h1 h3],{'Leg1' 'Leg3'});
Assuming that the line1 and line3 have been assigned to h1 and h3 (h1 = plot(...), h3 = plot(...)), respectively.
Greg Vieira
el 4 de Sept. de 2021
How can you do this for multiple plots? For example, I have 1001 data sets plotted and only want the legend to show 1 of the first 1000 plots and the last plot. It is not reasonable for me to place 999 ' ' placeholders.
Kaveh Vejdani
el 10 de Jun. de 2023
First plot data1, then data1001, the set L.AutoUpdate = 'off'; % L=Legend
Respuesta aceptada
Más respuestas (13)
A really good method is to do what's mentioned at https://stackoverflow.com/questions/13685967/how-to-show-legend-for-only-a-specific-subset-of-curves-in-the-plotting.
Essentially set the 'HandleVisibility' attribute to 'off' when plotting something, as such:
plot(x,y,'HandleVisibility','off')
This has some implications concerning interacting with that handle in other ways, but if you don't plan on using the handle, this is a great dynamic way to not include certain plots in your legend. It works especially well when you're plotting iteratively, and don't want to store handles and then hard-code the legend to fit your exact plot.
5 comentarios
Giuseppe Degan Di Dieco
el 2 de Nov. de 2021
Thank you Matt for updating the thread.
Keep in touch for tips sharing and creating a MATLAB users community.
Best.
Michael Van de Graaff
el 17 de En. de 2022
This was very helpful Matt, thank you
Sebastian Lopez
el 27 de Mayo de 2022
Really helpful. Thanks!
Andres Ricardo Herrera Orozco
el 16 de En. de 2024
Really helpful. Thanks!
Hannah
el 25 de Sept. de 2024
Fantastic advice. Thank you.
Walter Roberson
el 25 de En. de 2011
Editada: Rik
el 5 de Abr. de 2022
27 votos
You can set the IconDisplayStyle to off for the items you do not wish a legend for. See this documentation.
The link above was valid for the documentation from R2012a. The equivalent page in R2022a suggests a different strategy (i.e. only providing the handles to legend for the objects you wish to include). In the current release IconDisplayStyle is documentated under the properties of the graphics primitives (e.g. line objects or patch objects).
Documentation pages from specific releases will remain online for 5 years.
6 comentarios
Jack Barrett
el 27 de Oct. de 2011
this is a much nicer solution. kudos
Danny Smith
el 27 de Abr. de 2015
Wow, this solution is much smoother than the other proposed, and more generally applicable.
It allows you to turn off the ones you don't want, rather than having to turn on the ones you do. If you (like me) are plotting many data sets on the same graph, this is much more useful and simple.
If you have the handle for the data set you DON'T want included, all you need is this line:
set(get(get(h,'Annotation'),'LegendInformation'),'IconDisplayStyle','off');
where "h" is changed to the name of your handle.
For more information, follow the link provided by Walter and John.
Tom
el 22 de Abr. de 2016
This is the ideal solution for implementing "plot" in a loop where it is difficult to assign a unique handle each iteration. Thank you!
Nuwan Liyanage
el 25 de Ag. de 2020
This is really helpful, thanks!
Fernando Zigunov
el 29 de Nov. de 2021
broken link!
Tanya Meyer
el 5 de Abr. de 2022
Yes - broken link :(
Junette Hsin
el 21 de Mzo. de 2019
Editada: Junette Hsin
el 21 de Mzo. de 2019
25 votos
I ran into this problem and I have not seen this method suggested yet, but I solved it by changing the order of my plotted lines which affects what the legend displays (I am using MATLAB R2017b).
Let's say you plot 2 lines first, and then create a legend. Then you plot a 3rd line. That 3rd line will be added to your legend as 'data 1'.
Instead plot 3 lines, and then in your legend, label just the first 2 lines. The 3rd line will be omitted from the legend.
Hope this helps.
5 comentarios
TheLast One
el 1 de Jun. de 2019
Simplest solution :)
Orhan Soyuhos
el 13 de Jun. de 2020
Thank you!
Another way to eliminate further plots from getting an automatic legend update (resuting in the 'data 1', 'data 2' etc. legend entries) was suggested by Phuc Bui on 2021-03-03 in a comment for the entry zoomPlot : Kelsey Bower (2021). zoomPlot
The most simple way to avoid "data1", "data2" is turning off the autoupdate property of the legend:
legend({'A','B'},'AutoUpdate','off')
@Jim Tonti Yes! Upvote his solution: legend({'A','B'},'AutoUpdate','off')
Gabriela Belicova
el 13 de Mayo de 2022
Both very helpful, thank you so much !!!
Yasin Zamani
el 25 de Sept. de 2019
Editada: Yasin Zamani
el 25 de Sept. de 2019
For example, suppose you want to skip the name of the first plot in the legend:
x = linspace(0, 2 * pi);
% sin(x)
h = plot(x, sin(x));
% the following line skip the name of the previous plot from the legend
h.Annotation.LegendInformation.IconDisplayStyle = 'off';
% cos(x)
plot(x, cos(x));
% legend
legend('cos');
4 comentarios
Giulio Suzumura
el 17 de Oct. de 2020
Tks. Best approach when uses 'hold on's and external functions.
Donald Liu
el 21 de Jul. de 2021
Good solution, short and concise!
Carl Witthoft
el 8 de Sept. de 2021
doesn't seem to work for a "fill" object
Soham Sinha
el 11 de Mayo de 2022
Thanks
Boris Blagojevic
el 23 de Jun. de 2021
An alternative approach: Prevent the legend from updating
First, plot the lines that you want to have labeled. Then, specify the legend and set
legend(....,'AutoUpdate','off')
then, plot the remaining lines
4 comentarios
Riaan Ferreira
el 10 de Ag. de 2021
This worked briliantly
Faezeh Ashouri
el 10 de Abr. de 2022
Thanks!
Rik
el 13 de Jun. de 2022
intersted
Dr.Jaber Aljuaidiyah
el 20 de Ag. de 2024
This works nicely. Thanks pal
the cyclist
el 25 de En. de 2011
8 votos
Each curve has a handle, which can be obtained from the properties. Use the form of legend that takes two arguments (handle and legend), and only use the handles of those curves that you want to show.
Dilshad Raihan
el 26 de Oct. de 2015
Editada: Dilshad Raihan
el 26 de Oct. de 2015
2 votos
You can do this by first plotting the curves in an order so that the lines you don't want to be displayed in the legend comes in the end. That is, suppose you have N lines to be plotted but you dont want to display m of these in the legend. Then first plot the required N-m lines and then the remaining m. After that, turn the legend on, click on the legend and the "legend property editor" will be displayed. Go to the "more properties" option. You can see an entry titled "String" specified as a "1xN cell array". Click on the cell array icon and set the size as "1xN-m". Now, only the first N-m curves will be displayed in Legend.
1 comentario
Harish Pulluri
el 26 de Sept. de 2016
Thnak you sir, for giving the solution
You can simply delete the last undesired entry by the following:
% assume you plotted some curves before this line and all of them are desired to be shown in the legend
hleg = legend('show');
plot(x,y) % you don't need this plot in the legend
hleg.String(end) = []; % delete the last legend entry of the very last plot
% continue plotting while copy and paste the previous line immediately after any plot you don't need in the legend
1 comentario
Amir Semnani
el 9 de Jun. de 2021
Thanks. That worked for me (MATLAB 2017b) and it's very simple. Let's assume we have 8 datasets and we want to plot all of them, but only want to see the legend for dataset with even number.
x=ones(100,1)*(1:8); plot(x);ylim([0 9]); hleg = legend ('show'); hleg.String(1:2:end)=[];
Every time you plot, get the handle to the points or curves. Then pass only those that you want into legend. Here is a full demo:
lineSize = 2;
markerSize = 30;
% Define 3 data sets
x1 = [-1.9, 0.004, 1.94];
x2 = [-1.94, -0.23, 1.95];
x3 = [-1.92, .2, 1.93];
y1 = [13.885, 10.168, 14.235];
y2 = [9.3805, 5.2697, 9.3367];
y3 = [4.5262, 0.80904, 4.0889];
% Interpolate the 3 curves.
xFit = linspace(-2, 2, 500);
coefficients1 = polyfit(x1, y1, 2);
yFit1 = polyval(coefficients1, xFit);
coefficients2 = polyfit(x2, y2, 2);
yFit2 = polyval(coefficients2, xFit);
coefficients3 = polyfit(x3, y3, 2);
yFit3 = polyval(coefficients3, xFit);
% Plot the 3 data sets and their interpolated curves
handle1 = plot(x1, y1, 'r.', 'MarkerSize', markerSize);
hold on;
handle2 = plot(xFit, yFit1, 'r-', 'LineWidth', lineSize);
handle3 = plot(x2, y2, 'b.', 'MarkerSize', markerSize);
handle4 = plot(xFit, yFit2, 'b-', 'LineWidth', lineSize);
handle5 = plot(x3, y3, 'g.', 'MarkerSize', markerSize);
handle6 = plot(xFit, yFit3, 'g-', 'LineWidth', lineSize);
grid on;
% Have the legend only for the data, not the interpolated fit
% by passing in only the plot handles of the data.
legend([handle1, handle3, handle5], 'Data1', 'Data2', 'Data3', 'Location', 'north');
1 comentario
Allyce
el 20 de Ag. de 2025
This was certainly an easy way to solve the issue - I was using two y-axis situation and had optional items in each axis - so I COULD have ordered the plot statements but much easier to set up the handles and then use the legend at the end. Thank you.
Akshay Ravindran
el 26 de Nov. de 2015
0 votos
Why is it that this error keeps coming up?
<<

>>
3 comentarios
Walter Roberson
el 26 de Nov. de 2015
[z, x, c, v, b, n, m] looks like it might be intended as the list of "entries" to be annotated. Is it possible that those variables all hold column vectors instead of scalars, with the result that [z, x, c, v, b, n, m] is a 2 dimensional array?
Ajith Tom George
el 17 de Nov. de 2016
If z,x,c etc are the handles, then remove the commas:
i.e. [z w c ...] and you are good to go!
Walter Roberson
el 17 de Nov. de 2016
No, in each case where z w c etc are expressions that have no spaces in them, [z w c ...] is the same as [z, w, c, ...]
Spaces in expressions sometimes trigger parsing as if there were multiple expressions. For example:
[1 -2*x]
is considered two expressions, 1 and -2*x
Luke Marsden
el 2 de Feb. de 2017
I am trying to do a similar thing using this line of code:
leg = legend([p4 RETU_Average activity1 Vulcanian1], 'Tilt', 'RETU Mean Amplitude', 'Activity', '"Vulcanian" Explosions', 'Location', 'northeast');
I am getting this error:
Error using matlab.graphics.chart.primitive.Line/horzcat
Cannot convert double value 23 to a handle
Error in p1_zoom_plot (line 93)
leg = legend([p4 RETU_Average, activity1 Vulcanian1], 'Tilt', 'RETU Mean Amplitude', 'Activity', '"Vulcanian" Explosions', 'Location', 'northeast');
4 comentarios
Walter Roberson
el 2 de Feb. de 2017
One of p4 RETU_Average activity1 Vulcanian1 contains the numeric value 23 instead of containing the handle to a graphics object.
The comma looks suspicious there.
I speculate that you might have passed in the values you are plotting rather than a copy of the handle that you got when you plotted them.
Luke Marsden
el 3 de Feb. de 2017
Thanks for your reply Walter. With your help I have solved the problem.
23 is the first value in the vector named 'RETU_Average'. I was trying to pass the vector into the legend rather than the handle, which I created using this line of code.
p1 = plot (time, RETU_Average, 'LineWidth', 2);
New legend text for reference of anyone else who has made a similar mistake:
leg = legend([p4 p1 activity1 Vulcanian1], 'Tilt', 'RETU Mean Amplitude', 'Activity', '"Vulcanian" Explosions', 'Location', 'northeast');
Brent F
el 10 de Ag. de 2021
Have you gotten this method of generating a legend using plot handles to work within a subplot?
Juan Carlos de Luna
el 6 de Abr. de 2020
Select line in Plot Browser and type
set(get(get(gco,'Annotation'),'LegendInformation'),'IconDisplayStyle','off')
2 comentarios
Bart Boonstra
el 12 de Abr. de 2021
Thanks that worked for me!
Marya Sadki
el 29 de Nov. de 2021
Me too thanks
If you plot multiple lines with the same plot command like this
h(1,:) = plot(rand(4,11),'r')
hold on
h(2,:) = plot(rand(4,11),'b')
and use
legend
on this, you get a 2x11 long legend
but you only want to highlight the first red and first blue line use this;
legend([h(1,1) h(2,1)],'red','blue')
This is mentioned in the documentation as;
legend(subset,___) only includes items in the legend for the data series listed in subset. Specify subset as a vector of graphics objects. You can specify subset before specifying the labels or with no other input arguments.
Categorías
Más información sobre Legend en Centro de ayuda y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!


