plot3 two legends in one plot3
    4 visualizzazioni (ultimi 30 giorni)
  
       Mostra commenti meno recenti
    
i have
Z1={{rand(1,3)},[{rand(1,3)} {rand(1,3)} {rand(1,3)} {rand(1,3)} {rand(1,3)} {rand(1,3)} {rand(1,3)}],[{rand(1,3)} {rand(1,3)} ] }
 cl='gbrcmykw';
 for k4=1:numel(Z1)
 y=cell2mat(Z1{k4}');
 plot3(y(:,1),y(:,2),y(:,3),[ cl(k4) 's'],'MarkerSize',12,'DisplayName',sprintf('Zhluk %k4',y))
     hold on
     end
     title('Priebeh zhlukovania','FontSize',16,'Color','k')
     legend('show','Location','NorthEastOutside')
      hold on
     and i have
    TAZ4=[ 1 2 7; 1 2 8; 1 2 3; 7 4 1; 4 5 6 ]
for k4=1:size(TAZ4,1)
plot3(TAZ4(k4,1),TAZ4(k4,2),TAZ4(k4,3),[cl(k4)'X'],'MarkerSize',10,'DisplayName',sprintf('Tazisko %k4',TAZ))
hold on
end
legend('show','Location','SouthEastOutside')
How do I add two legends to a single plot ?
Thanks.
0 Commenti
Risposta accettata
  Kelly Kearney
      
 il 27 Gen 2014
        I'm not really sure that code does what you think it does... you're looping over the points too many times in your drawT function (I don't think you want that outer loop, just a single i to use if your if cases. Also, %k isn't a valid sprintf format, so you're labels are all the same.
Anyway, here's a simplified version... you can build from there.
 MON = [2.8 3.6 17.2; 5.4 8.3 15.8; 2.5 3.2 17.6];
 Z1={{rand(1,3)},[{rand(1,3)} {rand(1,3)} {rand(1,3)} {rand(1,3)} {rand(1,3)} {rand(1,3)} {rand(1,3)}],[{rand(1,3)} {rand(1,3)} ] }
 cl='grbckmyw';
 axes('position', [0.1 0.1 0.7 0.8]);
 view(3);
 hold on;
 for ii = 1:size(MON,1)
     h1(ii) = plot3(MON(ii,1), MON(ii,2), MON(ii,3), ...
                    'marker', 'X', ...
                    'color', cl(ii), ...
                    'displayname', sprintf('Tazisko %d', ii), ...
                    'MarkerSize', 10, ...
                    'linestyle', 'none');
 end
 cl='gbrcmykw';
 for ii = 1:size(Z1,2)
     xyz = cat(1, Z1{ii}{:});
     h2(ii) = plot3(xyz(:,1), xyz(:,2), xyz(:,3), ...
         'marker', 's', ...
         'color', cl(ii), ...
         'displayname', sprintf('Zhluk %d', ii), ...
         'markersize', 10, ...
         'linestyle', 'none');
 end
 leg1 = legendflex(h1, get(h1, 'DisplayName'), 'anchor', {'ne','nw'}, 'buffer', [5 0]);
 leg2 = legendflex(h2, get(h2, 'DisplayName'), 'anchor', {'se','sw'}, 'buffer', [5 0]);
Più risposte (1)
  Kelly Kearney
      
 il 27 Gen 2014
        You can't have two legends associated with a single axis using Matlab's legend. However, you can with legendflex. Remove your legend calls and add this code to the end:
 pos = get(gca, 'position');
 set(gca, 'position', pos.*[1 1 0.8 1]);
 h1 = findall(gca, 'marker', 's');
 h2 = findall(gca, 'marker', 'X');
 leg1 = legendflex(h1, get(h1, 'DisplayName'), 'anchor', {'ne','nw'}, 'buffer', [5 0]);
 leg2 = legendflex(h2, get(h2, 'DisplayName'), 'anchor', {'se','sw'}, 'buffer', [5 0]);
You could make all this plotting a lot cleaner if you saved the handles of your plot objects, and then set things like marker and color after the fact, but I've left that alone for now. Note that I added the resizing of the axis, since unlike legend, legendflex doesn't automatically resize axes to allow space for legends.
6 Commenti
Vedere anche
Categorie
				Scopri di più su Entering Commands in Help Center e File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!