所以我正在编写一个函数,用于绘制来自 n 不同单元格的矩阵数据。如果 n 为10,则应在单个图上显示10个等间距的图。如果 n 为7,则应尝试尽可能均匀地将它们分开(因此3x2或2x3绘图本身就有一个绘图)。
我能够使用subplot()
和plot()
绘制这些图形,但我很难找到如何初始化子图的尺寸。
每次运行后子图的数量都会发生变化,因此无法将其初始化为特定尺寸。
有人能指出我正确的方向吗?
答案 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)
另一个简单的解决方案是在平方根上使用round
和ceil
:
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