Help with plot legend
42 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Josh White
el 27 de Abr. de 2015
Comentada: Thorsten
el 28 de Abr. de 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 comentarios
Respuesta aceptada
pfb
el 27 de Abr. de 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...
Más respuestas (1)
Thorsten
el 27 de Abr. de 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 comentarios
pfb
el 28 de Abr. de 2015
Editada: pfb
el 28 de Abr. de 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
el 28 de Abr. de 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?
Ver también
Categorías
Más información sobre Data Distribution Plots en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!