【问题标题】:How to determine the dimensions of a subplot in Matlab?如何确定 Matlab 中子图的尺寸?
【发布时间】:2016-01-05 01:28:19
【问题描述】:

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

我可以使用subplot()plot() 绘制这些图表,但我很难找出如何初始化子图的尺寸。

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

谁能指出我正确的方向?

【问题讨论】:

  • 看起来您有任意规则来根据需要绘制的单元格数确定行数和列数以及图形数(10 个单元格 -> 单个数字,7 个单元格 -> 2 个数字)。是否对您寻求帮助或帮助处理结果行、列和数字计数的这些规则进行了编纂?
  • 您有最大子图数的上限吗?高吗?如果没有,您可能需要对不同的场景进行硬编码。如果是,您将希望从您的子图数量中获得最接近的整数,该整数可以表示为彼此“不太远”的 2 个因子的乘积。在您的示例中,7 是素数,因此您将永远无法平等地划分游览子图,因此您需要将 7 表示为 3x2+1。

标签: matlab plot data-visualization subplot


【解决方案1】:

恐怕这样的问题往往会很混乱。这通常需要针对不同情况解决此类问题。

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

条件的选择有点武断,因为 OP 中的规范似乎也有点武断。你大概明白这点,可以设置自己的条件。

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

1) 这使代码更易于编写。您不必想出一些复杂的解决方案,这些解决方案可能会在一段时间后出现。

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

要详细说明这一点并不容易,因为您尚未指定预期的案例数量或在奇数情况下最后一个情节会发生什么。不过,这可能会给出一个很好的提示。

祝你好运!

【讨论】:

  • 除了你的回答,我认为通过n的质数分解来寻找条件会很有帮助。
  • @BillBokeey 我假设质数分解是用来确定子图的大小,还是我错了?所以说如果有 9 个地块,子地块可以是 3x3?
  • 是的,在我看来是这样的:在素数分解中找到两个因子,给出最佳的高宽比,如果没有找到,用 n-1 重复,依此类推。但同样,这只是一个随机的想法。例如,如果 n=12=3x2x2 ,3x4 将是一个很好的候选。
【解决方案2】:

另一个简单的解决方案是在平方根上使用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

【讨论】:

    【解决方案3】:

    我今天遇到了一个非常相似的问题,我在定义适合所有内容的子图大小时遇到​​了很多麻烦。我的推理主要是一种技巧,但它可以提供帮助。如果您最多只能表示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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-11
      • 2013-11-30
      • 1970-01-01
      • 1970-01-01
      • 2011-04-05
      • 2011-11-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多