Help with plot legend

69 Ansichten (letzte 30 Tage)
Josh White
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!!!!

Akzeptierte Antwort

pfb
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...
  1 Kommentar
Josh White
Josh White am 27 Apr. 2015
YES!!! that worked perfectly, thanks!!!!!

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

Thorsten
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
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
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?

Melden Sie sich an, um zu kommentieren.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by