Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 在同一图表中绘制多个相似数据_Matlab_Plot - Fatal编程技术网

Matlab 在同一图表中绘制多个相似数据

Matlab 在同一图表中绘制多个相似数据,matlab,plot,Matlab,Plot,我想生成一个图(X vs Y),Z值取决于Y。下面的例子如图所示。X的矩阵大小与Z相同,但与Y不同。我可以将Z与X作图,但我想将所有的图合并成一个图,并将Y与X作图。我可以将多个图绘制成一个图,但图相互重叠 我的问题是,有没有任何方法可以将多个图合并为一个图,而不重叠每个图,因为每个图之间的差异非常小(例如Z1=1,2,3,4,5和Z2=1.0001,2.0002,3.0001,4.0002,5.0001)。所以,我想在不同的Y轴上设置每个Z图。(例如Y=0时的Z1,Y=2时的Z2…) 有人

我想生成一个图(X vs Y),Z值取决于Y。下面的例子如图所示。X的矩阵大小与Z相同,但与Y不同。我可以将Z与X作图,但我想将所有的图合并成一个图,并将Y与X作图。我可以将多个图绘制成一个图,但图相互重叠

我的问题是,有没有任何方法可以将多个图合并为一个图,而不重叠每个图,因为每个图之间的差异非常小(例如Z1=1,2,3,4,5和Z2=1.0001,2.0002,3.0001,4.0002,5.0001)。所以,我想在不同的Y轴上设置每个Z图。(例如Y=0时的Z1,Y=2时的Z2…)

有人有什么建议或想法吗


谢谢

最简单的方法是移动Z数据。但请注意,Z2看起来像是在1附近振荡-所以这是一个简洁的视觉表示,但可能会误导

% Simple version - shift Z curves by 0, 1, ... (as recommended by @Cris Luengo)
shiftMat = repmat(0 : size(Z, 2)-1, size(Z,1), 1);
Z = Z + shiftMat;

%Min shift up to have non-overlapping - curves touching
for i = 2 : size(Z, 2)
   Zdif = (Z(:, i-1) - Z(:, i));
   Z(:, i) = Z(:, i) + max(Zdif); % + 0.01 to separate them a little bit.
end

%Bigger shift up, to have all points of Z(2) equal or above all points of z1.
for i = 2 : numZ
    Zdif = max(Z(:, i-1))-min(Z(:, i));
    Z(:, i) = Z(:, i) + Zdif;
end

另一种可能性是有多个Y轴,并且每个Z曲线都对应其自己的Y轴绘制。这很可能是一种幻想,不应该误导,但这是一种更大的工作,即使在你掌握了功能之后,因为你仍然需要定位所有这些轴。默认情况下,MATLAB只允许使用2个轴,因此从fileexchange中获取一个函数以添加更多:

我将澄清我在评论中写的想法。 首先,让我们获取一些数据:

x = 470:0.1:484;
z1 = cos(x)/2;
z2 = sin(x)/3;
z3 = cos(x+0.2)/2.3;
我将只绘制三个数据集,所有这些对于扩展到任意数量的数据集来说都是微不足道的

想法1:多轴 这里的想法是简单地使用
子图
创建一个小型的多类型图:

ytick = [-0.5,0.0,0.5];
ylim = [-0.9,0.9]);
figure

h1 = subplot(3,1,1);
plot(x,z1);
set(h1,'ylim',ylim,'ytick',ytick);
title('z1')

h2 = subplot(3,1,2);
plot(x,z2);
set(h2,'ylim',ylim,'ytick',ytick);
title('z2')

h3 = subplot(3,1,3);
plot(x,z3);
set(h3,'ylim',ylim,'ytick',ytick);
title('z3')

请注意,例如,可以从顶部两个绘图中删除勾号标签,只在底部一个上保留标签。然后还可以移动轴,使它们更靠近(如果同一绘图中有许多这样的线,则可能需要这样做):

想法2:相同的轴,用偏移量绘图 这是更简单的方法,因为您只处理一个轴@Zizy Archer已经展示了如果数据都在一个2D矩阵
Z
中,那么移动数据是多么容易。在这里,我将只绘制
z1
z2+2
z3+4
。根据您的喜好调整偏移量。接下来,我设置
'ytick'
属性以创建单独图形的幻觉,并设置
'yticklab'
属性以使沿y轴的数字与绘制的实际数据匹配。最终结果与上面的多轴图类似,但它们都位于一个轴中:

figure
plot(x,z1);
hold on
plot(x,z2+2);
plot(x,z3+4);
ytick = [-0.5,0.0,0.5];
set(gca,'ytick',[ytick,ytick+2,ytick+4]);
set(gca,'yticklabel',[ytick,ytick,ytick]);
text(484.5,0,'z1')
text(484.5,2,'z2')
text(484.5,4,'z3')

Y是单元阵列还是结构?我想是结构。我已经修改了上面的问题以显示更多细节,请看一看。谢谢。你能突出你想解决的问题吗?我不明白你到底想做什么。大家好,我再次修改了问题,请看一看。谢谢。那么您想根据
x
绘制
z1
z2+1
z3+2
,等等?或者你想有6个独立的轴?我喜欢你如何计算偏移来匹配数据范围。但是在同一个图上有多个y轴的建议我不太喜欢——这很混乱,也无助于读取数据。你会读到的任何一本好的数据可视化书籍都会告诉你同样的事情:如果不同的数据系列需要不同的y轴,它们不属于同一个图。我认为带偏移量的图是我要找的1。我不需要y轴的标签,只需要将文本添加到z1,z2,。。并且已经包含在您的编码中。谢谢。
figure
plot(x,z1);
hold on
plot(x,z2+2);
plot(x,z3+4);
ytick = [-0.5,0.0,0.5];
set(gca,'ytick',[ytick,ytick+2,ytick+4]);
set(gca,'yticklabel',[ytick,ytick,ytick]);
text(484.5,0,'z1')
text(484.5,2,'z2')
text(484.5,4,'z3')