如何在Matlab中确定子图的尺寸?

时间:2016-01-05 01:28:19

标签: matlab plot data-visualization subplot

所以我正在编写一个函数,用于绘制来自 n 不同单元格的矩阵数据。如果 n 为10,则应在单个图上显示10个等间距的图。如果 n 为7,则应尝试尽可能均匀地将它们分开(因此3x2或2x3绘图本身就有一个绘图)。

我能够使用subplot()plot()绘制这些图形,但我很难找到如何初始化子图的尺寸。

每次运行后子图的数量都会发生变化,因此无法将其初始化为特定尺寸。

有人能指出我正确的方向吗?

3 个答案:

答案 0 :(得分:1)

我担心这样的问题往往会很混乱。通常这种问题需要针对不同的情况来解决。

if (mod(n,2) && n<8)
    % Do something
elseif (!mod(n,2) && n < 11)
    % Do something else
elseif ...
    ....
end

由于OP中的规范似乎也有点任意,所以条件选择有点任意。你可能理解这一点,并可以设定自己的条件。

我推荐这种方法有两个原因。

1)这使代码编写更简单。您不必提出一些复杂的解决方案,可能会在一段时间后中断。

2)通过添加案例,您可以保护自己免受大量情节的影响。如果图的数量太大,您通常不希望将所有图都放在同一图中。也可以将其包装到函数中,并在循环中一次将其应用于X图。通常,您希望每次迭代都是一个单独的数字。

要详细说明这一点并不容易,因为您还没有指定您期望的案例数量,或者在奇数的情况下最后一个情节会发生什么。这仍然可以提供一个很好的暗示。

祝你好运!

答案 1 :(得分:1)

另一个简单的解决方案是在平方根上使用roundceil

for n=1:20
    [n, round(sqrt(n))*ceil(sqrt(n)),  round(sqrt(n)), ceil(sqrt(n))]
end

输出:

%(n, total_plots, x, y)
 1     1     1     1
 2     2     1     2
 3     4     2     2
 4     4     2     2
 5     6     2     3
 6     6     2     3
 7     9     3     3
 8     9     3     3
 9     9     3     3
10    12     3     4

用法示例:

n = 7
subplot(round(sqrt(n)), ceil(sqrt(n)), plot_nr_x) % switch first 2 params to have either a slightly longer or slightly wider subplot

答案 2 :(得分:0)

我今天遇到了一个非常类似的问题,我在定义适合所有事情的子图的大小方面遇到了很多麻烦。我的推理主要是一个黑客,但它可以帮助。如果您必须代表最多n个数字,那么您可以将其作为sqrt(n) * sqrt(n)的方格。为了使事情变得更好,我们添加了一个安全行,因此最终矩阵将为(sqrt(n) + 1) * sqrt(n)。我希望这有助于解决您的问题。

在我的代码中有2个嵌套循环:

在一个循环内,为每个kk元素打开一个数字,用于绘制数组中x位置的特定图形。

for kk=1:length(some_file_list)

      % Load data
      % do some math
      % get data as a cell array with things we care about in data(3,)

    array_size = size(data(3,:),2);

      for x=1:size(data(3,:),2);

    % do more math and get things ready to plot matrix_A scaled by range_A

            figure(kk); % open figure       
                grid_rows = round((sqrt(array_size)+1));
                grid_cols = round(sqrt(array_size));

                % plot
                subplot(grid_rows, grid_cols, x);
                imagesc(matrix_A,range_A); %plot in position
                colormap(gray);
         end
 end