Concatenating 2D plots

人走茶凉 提交于 2019-11-28 14:24:15

I see two options here: 1. concatenate to the same plot and pad with NaNs to obtain the gap. 2. actually have several plots and use axes in a clever way.

Here's an example for option 1, First we'll create some fake data:

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

This is just for padding with NaNs...

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

Concatenating:

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

plotting

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

This is regarding the legend part of your question:

In order to have a single legend entry for several, separately-plotted items (the more accurate term would be "children of the axes object"), you should use hggroup. This way, plotted objects (such as lines) are grouped together (technically they become children of the hggroup instead of being children of the axes directly) thus allowing you to apply certain settings to the entire group simultaneously.

Here's a simple example of how this works:

%// 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');

Results in:

Whereas:

%// 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');

Where LegendGroupLatest is:

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

Results in:

In this example, all lines that were plotted inside the loop get added to a single hggroup without affecting previously drawn items, and you can obviously add different logic to assign plots to groups.

Notice that a dynamic legend usually adds any line that is present in the chart (if you draw a zoom box in an axes that has a dynamic legend - the zoom box borders temporarily get added to the legend!), but hggroup prevents that.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!