【问题标题】:Plot multiple similar data in same graph在同一个图中绘制多个相似数据
【发布时间】:2018-06-07 03:47:45
【问题描述】:

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

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

有人有什么建议或想法吗?

谢谢

【问题讨论】:

  • Y是元胞数组还是结构体?
  • 我认为是一个结构。我已经修改了上面的问题以显示更多细节,请看一下。谢谢。
  • 你能突出你试图解决的问题吗?我不明白你到底想做什么。
  • 大家好,我再次修改了问题,请看一下。谢谢。
  • 所以您想针对x 绘制z1、z2+1、z3+2 等?还是你想要 6 个独立的轴?

标签: matlab plot


【解决方案1】:

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

x = 470:0.1:484;
z1 = cos(x)/2;
z2 = sin(x)/3;
z3 = cos(x+0.2)/2.3;

我将只绘制三个数据集,所有这些都可以扩展到任意数量的数据集。

想法1:多轴

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

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')

请注意,例如,可以从顶部两个图中删除刻度标签,只留下底部的标签。然后,您还可以移动轴,使它们靠得更近(如果在同一个图中有很多这样的线,这可能是必要的):

set(h1,'xticklabel',[],'box','off')
set(h2,'xticklabel',[],'box','off')
set(h3,'box','off')
set(h1,'position',[0.13,0.71,0.8,0.24])
set(h2,'position',[0.13,0.41,0.8,0.24])
set(h3,'position',[0.13,0.11,0.8,0.24])
axes(h1)
title('')
ylabel('z1')
axes(h2)
title('')
ylabel('z2')
axes(h3)
title('')
ylabel('z3')

想法 2:相同的轴,带偏移量的绘图

这是更简单的方法,因为您只处理单个轴。 @Zizy Archer 已经展示了如果它们都在一个 2D 矩阵 Z 中移动数据是多么容易。在这里,我将仅绘制 z1、z2+2 和 z3+4。根据您的喜好调整偏移量。接下来,我设置'ytick' 属性以创建单独图形的错觉,并设置'yticklabel' 属性以使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')

【讨论】:

  • 我认为带有偏移量的情节是我正在寻找的 1。我不需要 y 轴的标签,只需将文本添加到 z1、z2、.. 并且已经包含在您的编码中。非常感谢。
【解决方案2】:

最简单的方法是移动 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 中获取一个函数以添加更多:https://www.mathworks.com/matlabcentral/fileexchange/9016-addaxis

【讨论】:

  • 我喜欢您计算偏移量以匹配数据范围的方式。但是我不太喜欢在同一个图上使用多个 y 轴的建议——它很混乱,无助于读取数据。您将阅读的任何优秀的数据可视化书籍都会告诉您同样的事情:如果各种数据系列需要不同的 y 轴,它们就不属于同一个绘图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-06
  • 2021-10-26
  • 1970-01-01
  • 2021-07-25
相关资源
最近更新 更多