How to add a color-dependent legend to scatter3 plot?
13 views (last 30 days)
Show older comments
Daniel Bridges
on 4 Aug 2016
Commented: Walter Roberson
on 8 Aug 2016
I have a 3D histogram via scatter3, but I wish to add a legend to state the frequency signified by the color. How do I do this?
Also, I would appreciate any simplifications you could suggest to my code below.
%%Plot a scatter3 histogram of the shifts.
xdata = tumorshifts(:,1); ydata = tumorshifts(:,2);
zdata = tumorshifts(:,3);
size = 10*shiftno;
for loop = 1:length(size)
if isequal(shiftno(loop),1)
size(loop) = size(loop)/10;
end
end
color = zeros(length(shiftno),3);
values = unique(shiftno);
% Resource: http://www.wolframalpha.com/input/?i=orange+RGB
% http://www.wolframalpha.com/input/?i=576+nm+light+to+RGB
for loop = 1:length(color)
if shiftno(loop) == values(1)
color(loop,1) = 130; color(loop,2) = 130; color(loop,3) = 130; % grey
elseif shiftno(loop) == values(2)
color(loop,1) = 41; color(loop,2) = 0; color(loop,3) = 255; % 452 nm
elseif shiftno(loop) == values(3)
color(loop,1) = 0; color(loop,2) = 214; color(loop,3) = 69; % 514 nm
elseif shiftno(loop) == values(4)
color(loop,1) = 132; color(loop,2) = 252; color(loop,3) = 0; % 576 nm
elseif shiftno(loop) == values(5)
color(loop,1) = 255; color(loop,2) = 8; color(loop,3) = 0; % 638 nm
elseif shiftno(loop) == values(6)
color(loop,1) = 158; color(loop,2) = 0; color(loop,3) = 0; % crimson
end
end
scatter3(xdata,ydata,zdata,size,color/255)
axis equal
title(['Histogram of ',num2str(length(unique(elektapatients.StudyID))),...
' Elekta Patients'' Daily Shifts'])
xlabel('Left [mm]')
ylabel('Superior [mm]')
zlabel('Posterior [mm]')
0 Comments
Accepted Answer
Walter Roberson
on 4 Aug 2016
%%Plot a scatter3 histogram of the shifts.
xdata = tumorshifts(:,1); ydata = tumorshifts(:,2);
zdata = tumorshifts(:,3);
pointsize = 10*shiftno;
for loop = 1:length(pointsize)
if shiftno(loop) == 1
pointsize(loop) = pointsize(loop)/10;
end
end
color = zeros(length(shiftno),3);
values = unique(shiftno);
% Resource: http://www.wolframalpha.com/input/?i=orange+RGB
% http://www.wolframalpha.com/input/?i=576+nm+light+to+RGB
cmap = [130, 130, 130; %grey
41, 0, 255; %452 nm
0, 214, 69; %514 nm
132, 252, 0; %576 nm
255, 8, 0; %638 nm
158, 0, 0]; %crimson
for loop = 1:length(color)
switch shiftno(loop)
case values(1): color(loop, :) = cmap(1,:); % grey
case values(2): color(loop, :) = cmap(2,:); % 452 nm
case values(3): color(loop, :) = cmap(3,:); % 514 nm
case values(4): color(loop, :) = cmap(4,:); % 576 nm
case values(5): color(loop, :) = cmap(5,:); % 638 nm
case values(6): color(loop, :) = cmap(6,:); % crimson
end
end
scatter3(xdata, ydata, zdata, pointsize, color/255)
axis equal
title(['Histogram of ', num2str(length(unique(elektapatients.StudyID))),...
' Elekta Patients'' Daily Shifts'])
xlabel('Left [mm]')
ylabel('Superior [mm]')
zlabel('Posterior [mm]')
hold on
for K = 1 : size(cmap, 1)
H(K) = scatter3(nan, nan, nan, K*10, cmap(K,:));
end
legend(H, {'grey', '452 nm', '514 nm', '576 nm', '638 nm', 'crimson'});
Note that size had to be renamed because you need the MATLAB size() function later.
Going from if/elseif to switch/case was just for cleaner code.
You might want to adjust the point size for the legend purposes.
Notice the trick here of using nan to create scatter points that will not show up. The points will exist and will have the proper color but they will not be rendered. This is done in order to get the individual handles of those scatter plots so that they can have individual legends generated. Any one scatter3() plot results in a single graphics handle and that would only permit a single legend entry. You need to create different handles for each entry you want to make.
2 Comments
Walter Roberson
on 8 Aug 2016
"When comparing handle objects, use == to test whether objects have the same handle. Use isequal to determine if objects with different handles have equal property values."
More Answers (0)
See Also
Categories
Find more on Legend in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!