【问题标题】:Concatenating 2D plots连接二维图
【发布时间】:2014-11-10 14:35:11
【问题描述】:

我在 MATLAB 中有几个二维图。在每个图中都有一些线(每条线是固定长度值的行向量)。总是有一条基线(黑色的),其余的彩色线可能存在也可能不存在。

, .

我需要将所有这些图连接成一个图,如下所示:

请注意,这些仅用于代表性目的,但可以很好地解释我的问题。我不知道该怎么做。有人有想法吗?一个例子可能是?此外,如上图所示,连续连接的图之间必须存在垂直间隙。 需要注意的几点:

  • y 轴对于所有图都是固定长度
  • 如果每个单独绘图的 x 轴为 1:m。那么最终串联图的 x 轴为 1:(n*m),其中 n 是要串联的单个图的数量。

另外,由于每条彩色线对应一种特定的数据,如何创建它的图例?谢谢!

【问题讨论】:

  • 如果您希望x 轴上的最终点为n*m,则不能有垂直间隙,因为这会在x 轴上引入更多点。但是,您可以这样做,但是您必须消除每个信号的一些点以便为垂直间隙腾出空间,并且您当然可以在xn*m 上制作最后一个点。如果消除每个信号上的点不是一个选项,那么您将最终的x 点可能必须类似于n*m + 20,其中我们有 20 个点来考虑图之间的所有间隙。这是可行的吗?
  • @rayryeng 我认为如果我选择不在第一行的端点和下一行的起点之间绘制线,则可以避免这种情况。 x 轴仍为 n*m。不是吗?可以说:情节(x(1:10)); plot(x(11:20)) 等等可能是...
  • 执行x(1:10) 然后x(11:20)x(1:20) 相同。如果你想有一个垂直间隙并且仍然保持点数为 20,你必须删除一些点。例如,如果你想在两个信号之间有 2 个元素的间隙,你可以这样做 x(1:9),然后 x(12:20)
  • 只是一个小问题,你想在 x 轴上有什么标签?
  • @natan - 这是一个非常有效的问题,我没想到自己会问这个问题!

标签: matlab plot concatenation matlab-figure legend


【解决方案1】:

我在这里看到两个选项: 1. 连接到同一个图并用 NaN 填充以获得间隙。 2.实际上有几个情节,巧妙地使用axes

这是选项 1 的示例,首先我们将创建一些假数据:

a1=rand(1,20);
b1=3+rand(1,20);
c1=6+rand(1,20);

a2=rand(1,20);
b2=3+rand(1,20);
c2=6+rand(1,20);

a3=rand(1,20);
b3=3+rand(1,20);
c3=6+rand(1,20);

这只是为了用 NaN 填充...

f=@(x) [ NaN(1,round(numel(x)/5)) x ];

连接:

y1=[f(a1) f(a2) f(a3)];
y2=[f(b1) f(b2) f(b3)];
y3=[f(c1) f(c2) f(c3)];

绘图

x=1:numel(y1);
plot(x,y1,x,y2,x,y3);
set(gca,'XTickLabel',[]); 

【讨论】:

  • 感谢您的示例!我有一个问题,如果缺少 a2 怎么办?根据我上面的问题,每个情节的编号都可能不同。彩色信号...
  • 然后用已知元素长度的NaNs 向量表示它,例如a2=NaN(1,numel(a1)) 如果a1a2 具有相同数量的元素...跨度>
【解决方案2】:

这是关于您问题的legend 部分:

要为多个单独绘制的项目(更准确的术语是“轴对象的子项”)创建一个图例条目,您应该使用hggroup。这样,绘制的对象(例如线)被组合在一起(从技术上讲,它们成为hggroup 的子代,而不是直接成为axes 的子代),从而允许您同时将某些设置应用于整个组。

这是一个如何工作的简单示例:

%// Without hggroup
figure(1337); hold all;
x = linspace(-pi/2,pi/2,200);
for ind=1:3
    plot(x,sin(ind*x+ind),'DisplayName',...
         ['sin(' num2str(ind) 'x+' num2str(ind) ')']);
end
legend('-DynamicLegend','Location','NorthWest');

结果:

鉴于:

%// With hggroup
figure(1338); hold all;
x = linspace(-pi/2,pi/2,200);
prePlot=length(get(gca,'Children'));
for ind=1:3
    plot(x,sin(ind*x+ind),'DisplayName',...
         ['sin(' num2str(ind) 'x+' num2str(ind) ')']);
end
postPlot=length(get(gca,'Children'));
meshGrp = LegendGroupLatest(gca,postPlot-prePlot);
set(meshGrp,'DisplayName','Some sines');
legend('-DynamicLegend','Location','NorthWest');

LegendGroupLatest 在哪里:

function grpName=LegendGroupLatest(ax_handle,howMany)    
    grpName=hggroup; 
    tmp=get(ax_handle,'Children'); set(tmp(2:howMany+1),'Parent',grpName);
    set(get(get(grpName,'Annotation'),...
                'LegendInformation'),'IconDisplayStyle','on');

结果:

在此示例中,循环内绘制的所有线都添加到单个 hggroup 中,而不会影响先前绘制的项目,并且您显然可以添加不同的逻辑来将绘图分配给组。

请注意,动态 图例通常会添加图表中存在的任何 line(如果您在具有动态图例的轴中绘制缩放框 - 缩放框边框会暂时添加传奇!),但hggroup 阻止了这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    • 1970-01-01
    • 1970-01-01
    • 2016-02-01
    • 2018-07-29
    相关资源
    最近更新 更多