0

有没有办法传入 N 个数据集并使用 for 循环将它们绘制成折线图?我通过传递固定数量的参数(例如 M1、M2、M3、M4)来做到这一点,然后像下面那样手动重复绘图。但我想知道是否有办法动态编码函数?假设我可以传入 4 个数据集或 40 个数据集,并通过循环将它们绘制在一个图中。

function plot_four_cdf(M1,M2,M3,M4)

[ycdf1,xcdf1] = cdfcalc(M1);
ycdf1 = ycdf1(2:length(ycdf1));
plot(xcdf1, ycdf1, '-+k', 'LineWidth', 1);

hold on;
[ycdf2,xcdf2] = cdfcalc(M2);
ycdf2 = ycdf2(2:length(ycdf2));
plot(xcdf2, ycdf2, '-ok', 'LineWidth', 1);
hold off;

hold on;
[ycdf3,xcdf3] = cdfcalc(M3);
ycdf3 = ycdf3(2:length(ycdf3));
plot(xcdf3, ycdf3, '-*k', 'LineWidth', 1);
hold off;

hold on;
[ycdf4,xcdf4] = cdfcalc(M4);
ycdf4 = ycdf4(2:length(ycdf4));
plot(xcdf4, ycdf4, '-sk', 'LineWidth', 1);

legend('M100','M80','M50','M20',...
   'Location','SE')

xlabel('Relative Error');
ylabel('CDF');
end
4

1 回答 1

0

您可以将所有数据分组到一个单元格数组中并将其传递给函数:

function plot_cdfs(M)

    figure, hold on

    linestyles = {...
        '-+k', '-ok', '-*k', '-sk', ...
        '-+r', '-or', '-*r', '-sr');

    legendentries = cell(size(M));

    for ii = 1:numel(M)
        [ycdf, xcdf] = cdfcalc(M{ii});
        plot(xcdf, ycdf(2:end), linestyles{ii}, 'LineWidth', 1);
        legendentries{ii} = ['M' num2str(ii)];    
    end

    legend(legendentries{:}, 'Location','SE')

    xlabel('Relative Error');
    ylabel('CDF');

end

请注意,M它的构造类似于

M = {M1, M2, M3, ...} 

也可能在自己的循环中。另请注意,legendentries现在有点难以定义。您可以将它们作为单独的参数传递给函数(更好的选择),或者将它们填充到M它们描述的数据旁边的同一个单元格数组中(不是很便携)。

另请注意,您必须进行一些错误检查(现在,只能制作 8 种不同的图。如果您做的更多,则会导致错误)。

于 2012-08-14T04:37:39.783 回答