我想在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
和之间创建一个阴影灰色区域fUp
,f
中间用黑色实线表示,如下图所示。
现在,当我们接近置信区间的下限(分别为上限)时,我希望阴影区域降低其颜色。特别是,我希望在接近其边界时,阴影区域变得越来越亮。有办法吗?我正在做两个单独的补丁程序,因为我认为这可能对于我的目的是必要的。
您可以将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]);
哪个产生:
子区域重叠并产生最大的facealpha n*(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;
凉!完善!如您所说,如果置信区间的宽度取决于x,则需要做一些额外的工作,否则效果很好。