阻止Matlab线图重叠

3

我会使用 plothold on 将许多线绘制在一起,但是如果其中一个线条与其他线条重叠,我希望它能够稍微偏移一下。 例如,在以下情况下:

plot(1:100); hold on; plot(-100:100,abs(-100:100))

我希望明确指出这里有两个图表,我尝试过简单地增加不同图表的x值,但这会使数据偏差太大。

for z=1:numberofplots
plot((1:size(locations,2))+0.1*z,locations(z,:)','color', altclrz(z,:));
end

2
作为一种解决方法,您可以使用像 '--o' 这样的线型,这些线型会使底层线条可见。 - Deve
4
使用另一个维度怎么样?使用 plot3 绘制图形,并为每个图形设置不同的 z 值。然后将视角设置为适当的值。 - Itamar Katz
@Deve那不行,所有图中空格都在同一区域。 - Daniel
@ItamarKatz 我找不到比我已经拥有的更好的“适当值”。 - Daniel
@Daniel 使用 --r 表示一行,使用 -b 表示另一行,例如。然后你会看到蓝线下面有红线。当然,这仅适用于有限数量的行。 - Deve
@Daniel 你可以尝试增加其中一个图的线宽。 - Eitan T
1个回答

5
你可以通过以下几种方式区分曲线: -1- 数据倾斜 就像你说的那样,你可以稍微移动一下数据。我建议你固定坐标轴,然后计算每个线宽有多少单位,这样你就可以得到非常紧密的拟合效果,像这样:
lineWidth = 5;

figure(33);
clf;
subplot(1,2,1);
h = plot(myData, 'linewidth', lineWidth);
xlim([1,5]);
ylim([1,5]);
title('Original');

myData = meshgrid(1:5)';

myLimDiff = diff(ylim);
set(gca,'units', 'pixels');
myPos = get(gca, 'position')
myWidthHeight= myPos(3:4)

PixelsPerUnit =myWidthHeight(2)./ myLimDiff;
myDataSkewed = myData + meshgrid(-2:2)*1/PixelsPerUnit(1)*lineWidth;

subplot(1,2,2);
plot(myDataSkewed, 'linewidth', lineWidth);
xlim([1,5]);
ylim([1,5]);
title('Skewed');

结果:

在此输入图片描述

-2- 使用实线和虚线

正如其他评论中提到的,您可以在实线上使用虚线,或者使用一些组合样式。

-3- 使用不同的线条粗细

使用不同的线宽,最厚的放在底部:

figure(54);
clf
hold all
for ind = 10:-3:1
    plot(1:5, 'linewidth', ind);
end

enter image description here

-4- 使用带有变化的单独图表来显示每条线

另一种逐行绘制的方法是将每行绘制在一个子图中,但首先以灰色绘制所有数据。这样您可以看到所有线条的位置,并呈现特定线条:

enter image description here

figure(55);
clf
data = rand(3);

for ind = 1:3    
    subplot(1,3,ind);
    plot(data, 'linewidth', 4, 'color', [1 1 1]*.75);
    hold on
    plot(data(:,ind), 'linewidth', 2);
end

到目前为止,大多数想法的问题在于我有相当多的情节,通常超过50个。这使得2、3和4不适用。1看起来非常好,我会立即检查它。(我希望它可以在使用hold分别完成情节时正常工作) - Daniel
1
即使原帖作者不能使用,我认为点子4还是一个很好的解决方案。因此我支持+1。 - nispio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接