首页 > 解决方案 > Matlab中的阴影图

问题描述

我想在 Matlab 中绘制一个带有阴影区域的函数,表示它的不确定性(例如,置信区间)。这可以通过使用fill函数创建色块来实现。例如

x = linspace(0, 2*pi, 100);
f = cos(x);
fUp = cos(x) + 1;
fLow = cos(x) - 1;

x2 = [x, fliplr(x)];

plot(x, f, 'k')
hold on
fill(x2, [f, fliplr(fUp)], 0.7 * ones(1, 3), 'linestyle', 'none', 'facealpha', 0.4);
fill(x2, [fLow, fliplr(f)], 0.7 * ones(1, 3), 'linestyle', 'none', 'facealpha', 0.4);

fLow这会在函数和之间创建一个灰色阴影区域fUpf中间用黑色实线表示,如下图所示。

在此处输入图像描述

我现在想让阴影区域在我们接近置信区间的下限(分别是上限)时降低其颜色。特别是,我希望在接近其边界时,阴影区域变得越来越亮。有没有办法做到这一点?我正在做两个单独的补丁,因为我认为这对于我的目的可能是必要的。

标签: matlabplotdata-visualization

解决方案


您可以将 CI 拆分为n子区域:

x = linspace(0, 2*pi, 100);
f = cos(x);
n = 20;  % step number
g = 0.3; % grayscale intensity
fUp = cos(x) + linspace(0,1,n).';
fLow = cos(x) - linspace(0,1,n).';

x2 = [x, fliplr(x)];

plot(x, f, 'k')
hold on
fill(x2, [repmat(f,n,1), fliplr(fUp)], g * ones(1, 3), 'linestyle', 'none', 'facealpha', [1/n]);
fill(x2, [fLow, repmat(fliplr(f),n,1)], g * ones(1, 3), 'linestyle', 'none', 'facealpha', [1/n]);

哪个产品:

在此处输入图像描述

子区域重叠并产生最大 facealphan*(1/n) * g = g

请注意,这种方法并不是真正有效的内存(因为它n在每一侧产生子区域)并且仅适用于线性阴影。

如果您的 CI 是非线性的,那么您应该调整这部分:

% Prediction              Linear CI
%     ↓                       ↓
    cos(x)       +     linspace(0,1,n).';
    cos(x)       -     linspace(0,1,n).';

% Prediction                   Non linear CI
%     ↓                              ↓
    cos(x)       +     your_non_linear_CI_distribution;
    cos(x)       -     your_non_linear_CI_distribution;

推荐阅读