在MATLAB中绘制另一个子图中的子图

时间:2016-07-05 14:57:14

标签: matlab plot subplot

我试图在MATLAB中的另一个子图中绘制一个子图。问题是最终的子图仅显示较小子图的部分。在网上进行一些搜索之后,这里似乎有一个选择是将子图保存到临时图中并将其添加到最后的子图之后。另一种方法是手动指定最终图形内的图形位置,即滚动您自己的子图形。我想知道是否有更优雅的方法。如果这不是可能的/理想的行为,请提前道歉。我对代码如何运行的想法是:

someData = linspace(0,10);
subplot(2,2,1);
plotThing(someData);
subplot(2,2,2);
plot(cos(someData));

function [ out ] = plotThing( someData )
   y1 = sin(someData);
   y2 = sin(2*someData);
   y3 = sin(4*someData);
   y4 = sin(8*someData);
   f = figure(4);

   subplot(2,2,1)
   plot(someData,y1)
   subplot(2,2,2)
   plot(someData,y2)
   subplot(2,2,3)
   plot(someData,y3)
   subplot(2,2,4)
   plot(someData,y4)

   out = f;
end

我希望的行为是在最后一个图中有两个东西,顶部有四个项目的子图,下面是单个图。任何建议都会很棒。

编辑 - 接受答案的问题是它需要大量的子图(在我的情况下为12x12)。经过一番思考和工作,我发现可以将子图的内容封装到uipanel中。这使得子图的期望行为能够被视为更大比例的图中的单元。完成此任务的代码如下所示:

plotThing(someData, [0, 0.5, 1, 0.5]);
panel2 = uipanel('Position', [0, 0, 1, 0.5]);
subplot(1,1,1,'Parent', panel2); %Strange but necessary as one cannot set the parent of a plot directly
plot(cos(someData));

function [ out ] = plotThing( someData, position )
    panel = uipanel('Position', position); 

    y1 = sin(someData);
    y2 = sin(2*someData);
    y3 = sin(4*someData);
    y4 = sin(8*someData);

    subplot(2,2,1, 'Parent', panel)
    plot(someData,y1)
    subplot(2,2,2, 'Parent', panel)
    plot(someData,y2)
    subplot(2,2,3, 'Parent', panel)
    plot(someData,y3)
    subplot(2,2,4, 'Parent', panel)
    plot(someData,y4)
end

这种通用解决方案的结果如下: results

3 个答案:

答案 0 :(得分:2)

你应该能够通过告诉MATLAB你的子图的范围如下来做到这一点。

subplot(4,2,1);  % create a plot with subplots in a grid of 4 x 2
plot(someData,y1); % subplot at first row, first column
subplot(4,2,2);
plot(someData,y2); % subplot at first row, second column
subplot(4,2,3);
plot(someData,y3);
subplot(4,2,4);
plot(someData,y4);
subplot(4,2,[5 6 7 8]); % subplot spanning the entire third and fourth row
plot(someData,y5);      % change [5, 6, 7, 8] to change the span

答案 1 :(得分:0)

你仍然会使用subplot命令,如果你想让它占用超过1个空间,只需使用一个向量:

subplot(2,4,1)
plot(someData,y1)
subplot(2,4,2)
plot(someData,y2)
subplot(2,4,3)
plot(someData,y3)
subplot(2,4,4)
plot(someData,y4)

subplot(2,4,[5:8])
plot(bigPlot,y5)

应该这样做。

答案 2 :(得分:0)

可以避免使用精细网格并在多个字段上跨越更大的图:即使在同一图中,也可以使用不同的网格大小调用子图。但是应该首先绘制最小网格中的子图,否则我会遇到一些重叠(在Matlab 2017中)。你必须确保你的网格适合在一起。

例如:

subplot(4,2,1)
plot(someData)
subplot(4,2,3)
plot(someData)
subplot(2,2,2)
plot(someData)
subplot(2,2,3)
plot(someData)
subplot(2,2,4)
plot(someData)