BernardoCaldas
BernardoCaldas

Reputation: 55

How to display two overlapping lines in matlab

I have to plot 5 lines that overlap in some regions, and I need to be able to see all the lines.

I can think of shifting the lines a bit to allow them to be displayed, but this doesn't seem a very elegante solution. Even so, how could I code such a thing?

Is there any other way to plot multiple overlapping lines while being able to distinguish them at every point?

For exemple, here is one exemple with 3 overlapping lines: enter image description here

Thank you in advance!

Upvotes: 2

Views: 6283

Answers (3)

mmagnuski
mmagnuski

Reputation: 1275

Another way is to use transparency.
Unfortunatelly, line objects do not obey
transparency commands :(

A workaround is to:
1. download patchline (<-- link to Matlab Central)
2. use it to plot patchline with transparency

Once you have patchline, you can try something like:

% create some lines:
l1 = [1, 1, 1, 0, 0, 0.25, 1, 1, 0, 0, 0, 0, 1 1];
l2 = [0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1];
l3 = [1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0];  

% plot with patchline (notice the use of 'EdgeAlpha'):
figure; 
patchline(1:length(l1), l1, [], 'EdgeColor', [0.8, 0.2, 0.35],...
    'LineWidth', 5, 'EdgeAlpha', 0.5 ); 
hold on;  

patchline(1:length(l1), l2, 'EdgeColor', [0.2, 0.7, 0.55],...
    'LineWidth', 5, 'EdgeAlpha', 0.5 );  

patchline(1:length(l1), l3, 'EdgeColor', [0.1, 0.2, 0.95],...
    'LineWidth', 5, 'EdgeAlpha', 0.5);  

% change y limits to see line overlap clearly
set(gca, 'YLim', [-0.5, 1.5]);

As you can see - this is far from perfect
Not an ideal way to do it - the rough 'cracks' will stay this way,
but you can experiment with different line widths or moving the
lines in y axis by a value that would correspond to an image with each
line covering only half of it closest neighbour...

Upvotes: 1

anandr
anandr

Reputation: 1662

You may play with EraseMode property of the plot line. The following code example shows how to shift the lines and EraseMode effect:

% First we generate some data
NLines      = 2;
NPoints     = 50;
LineWidth   = 3;
ShiftStep   = 1.1;
XData       = linspace(0,1,NPoints);
YData       = rand(NPoints,NLines);
for k=1:NLines
    YData(:,k) = YData(:,k) > (k/(NLines+1));
end

% Then we create plot
figure('color','w');
subplot(3,1,1); plot(XData,YData, 'LineWidth',LineWidth);
                ylim([-0.1 1.1]);
                title('simple')
subplot(3,1,2); plot(XData,YData+repmat((0:NLines-1)*ShiftStep,NPoints,1), 'LineWidth',LineWidth, 'EraseMode','xor');
                ylim([-0.1 1.1+ShiftStep*(NLines-1)]);
                title('Shifted vertically')
subplot(3,1,3); plot(XData,YData, 'LineWidth',LineWidth, 'EraseMode','xor');
                ylim([-0.1 1.1]);
                title('EraseMode = xor')

In my opinion if you have more than three lines similar to your plot, shifting is visually more attractive. Also you may create several axes (Like I did) and plot each line in its own axes, so they will have y-labels set accordingly, but their X-labels will be essentially the same.

Upvotes: 0

Hugh Nolan
Hugh Nolan

Reputation: 2519

You can use plot3 and assign different Z values to different overlapping lines. However, it'll look more like you expect (Z being the "up" direction) if you swap the Y and Z axes:

Example:

Y1 = randn(1,100);
Y2 = randn(1,100);
X = 1:100;
Z1 = 1*ones(size(X));
Z2 = 2*ones(size(X));

plot3(X,Z1,Y1);
hold on;
plot3(X,Z2,Y2);

Upvotes: 0

Related Questions