Combine multiple data series into a single series

16 views (last 30 days)
Is there a way to combine multiple data series so that they only display as a single series in the Legend?
I have a function that uses 'plot' to plot multiple line segments. It can be thought of as a custom 'marker' shape class. Each data point is drawn using multiple line segments. I plot this (conceptually) single data series on the same plot as multiple other data series.
When I use the 'legend' function, each segment shows up as a separate element. So if I have plotted 2 series using the standard 'plot' function, and one using this custom function, with N data points, the legend thinks that there are N+2 data series. I want to treat this as 3 data series.

Accepted Answer

Adam Danz
Adam Danz on 22 Mar 2019
Edited: Adam Danz on 19 Aug 2020
Specify a vector of object handles in your call to legend.
Example
hold on
h(1) = plot(x,y);
h(2) = plot(x2,y2);
h(3) = plot(x3,y3);
legend(h(1), 'data')
If you're using the 'DisplayName' property, you can use the legendUnq() FEX submission to represent only unique names in your legend.
Example
hold on
for i = 1:3
h(i) = plot(rand(1,10), rand(1,10, 'o'), 'DisplayName', sprintf('Data_%d',i));
end
legend(legendUnq(gca))
  2 Comments
Peter
Peter on 22 Mar 2019
Thanks, this is exactly what I was looking for. I assumed that you could pass the handle into 'legend' but I couldn't figure out how.
I ended up outputing the handle of the first segment from the custom plot function.
hold on
h(1) = plot(x,y);
h(2) = plot(x2,y2);
h(3) = plotCustom(data);
Legend{1}='series 1';
Legend{2}='series 2';
Legend{3}='series 3';
legend(h,Legend)
function[h]=plotCustom(data)
...
h=plot([(xStart;xEnd],[yStart;yEnd],'color',c);
h=h(1);%combine all plotted segments into a single handle, so that the legend treats this as a single series
end
Adam Danz
Adam Danz on 22 Mar 2019
Edited: Adam Danz on 22 Mar 2019
One simplification I could suggest: if you use the 'DisplayName' property in your call to plot, you don't need to produce the "Legend" cell array.
function[h]=plotCustom(data)
...
temph=plot([(xStart;xEnd],[yStart;yEnd],'color',c, 'DisplayName', sprintf('series %d', i))); % assumes 'i' is available
h(i)=temph(1);
...
legend(h)
end

Sign in to comment.

More Answers (0)

Categories

Find more on Visual Exploration in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!