Help with plot legend
69 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Josh White
am 27 Apr. 2015
Kommentiert: Thorsten
am 28 Apr. 2015
I am trying to plot several groups (25 in my example) of data on one plot, with a legend representing each. Here is my code:
aa = 25;
c = hsv(n);
n = 25
figure; hold on; axis tight; grid on; box on;
for k = 1:n;
xy = c(k,:); % assign a different color to each group
a = outputs2{1,k} % my data is held in cells in a 1 x 25 cell array
if sum(a) ~= 0; % some groups of data are empty (this data was generated from the nctool
h(k) = scatter(a(:,3), a(:,1), aa, xy, 'filled') % seems to work....
name{k} = ['group ' num2str(k)]; % attempting to make a string array for the legend
end
end
legend(h, name);
But i get this error:
Error using legend (line 120)
Invalid argument. Type 'help legend' for more information.
Error in PlotOutputs2 (line 19)
legend(h, name);
Error in run (line 96)
evalin('caller', [script ';']);
The plot works, just not the legend. I've tried a hundred different variations and this is the closest i can get.
Also, and this is a different problem, but i spent some time trying to install the legappend tool this morning with no luck. That was also error prone. With that, i ran the example that comes with it and just got errors. I'm not sure what the mistake I'm making with that is.
Also today I reinstalled MATLAB just in case I had damaged the legend tool somehow.
Any help is greatly appreciated!!!!
0 Kommentare
Akzeptierte Antwort
pfb
am 27 Apr. 2015
Not very sure, but I guess that the problem might be in some of the elements of h being zero, on account of the condition about empty plots.
May I suggest this? Just plot what you have to plot, and use the DisplayName property to set the relevant legend string
name = ['group ' num2str(k)];
h(k) = scatter(a(:,3), a(:,1), aa, xy, 'filled','DisplayName',name);
After you're done, inserting the legend
legend(gca,'show');
should show the correct thing.
Otherwise, you may modify your code so that h contains only entries corresponding to existing objects. You can find nonzero elements in h, or introduce a different counter kk that is increment only for nonempty groups...
Weitere Antworten (1)
Thorsten
am 27 Apr. 2015
You have to get rid of the empty entries
h(h==0) = [];
name(cellfun(@isempty, name)) = [];
before you can call
legend(h, name)
3 Kommentare
pfb
am 28 Apr. 2015
Bearbeitet: pfb
am 28 Apr. 2015
Maybe, with reference to Josh's original code and Thorsten's proposal,
% get nonempty plots
ne = (h ~=0); % or else ne = ~(~h);
% leave only those in the handles
h = h(ne);
% leave only those in the cell array containing the names
name = name(ne);
% place all in the legend
legend(h,name);
But using DisplayName saves you from storing the labels in a cell array.
Thorsten
am 28 Apr. 2015
I used
h(h=0) = [];
to delete the zero entries in h; I can see no reason why it doesn't work for you. What are the values in your h?
Siehe auch
Kategorien
Mehr zu Legend finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!