Plot teduh di Matlab

Oct 13 2020

Saya ingin memplot fungsi di Matlab dengan area yang diarsir yang menunjukkan ketidakpastian di atasnya (misalnya, interval kepercayaan). Ini dapat dicapai dengan menggunakan fillfungsi untuk membuat tambalan warna. Sebagai contoh

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);

Ini menciptakan area abu-abu berbayang antara fungsi fLowdan fUp, dengan fdi tengah direpresentasikan sebagai garis hitam pekat, seperti pada gambar di bawah ini.

Sekarang saya ingin agar area yang diarsir menurunkan warnanya saat kita mendekati batas bawah (resp. Atas) dari interval kepercayaan. Secara khusus, saya ingin saat mendekati batasnya, area yang diarsir menjadi lebih cerah dan lebih cerah. Apakah ada cara untuk melakukannya? Saya melakukan dua tambalan terpisah karena menurut saya itu mungkin perlu untuk tujuan saya.

Jawaban

7 obchardon Oct 13 2020 at 16:02

Anda dapat membagi CI Anda menjadi nsubarea:

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]);

Yang menghasilkan:

Subarea tersebut tumpang tindih dan menghasilkan facealpha maksimal n*(1/n) * g = g

Perhatikan bahwa metode ini tidak benar-benar hemat memori (karena menghasilkan nsubarea di setiap sisi) dan hanya akan bekerja dengan bayangan linier.

Jika CI Anda non linier maka Anda harus menyesuaikan bagian ini:

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

untuk

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