Как заполнить область между кривыми с помощью Plots.jl?

Предположим, у меня есть кривая yи две другие кривые u а также l в виде векторов. Как построить

plot(y, lab="estimate")
plot!(y-l, lab="lower bound")
plot!(y+u, lab="upper bound")

То есть асимметричный доверительный интервал? Я знаю, как построить симметричный случай с опцией ribbon как объяснено здесь.

4 ответа

Решение

Оказывается, вариант ribbon принимает как нижнюю, так и верхнюю границы:

plot(y, ribbon=(l,u), lab="estimate")

Обратите внимание, что мимоходом l а также u в ribbon опция, заполненная область будет соответствовать области между y-l а также y+u, Другими словами, l а также u должны быть "отклонения" от средней кривой y,

Текущие ответы НЕ верны. Есть два способа , которые являются правильными (по состоянию на v1.10.1 из Plots.jl):

Метод 1 : Использование

      plot(x, l, fillrange = u, fillalpha = 0.35, c = 1, label = "Confidence band")

Метод 2 : Использование

      plot(x, (l .+ u) ./ 2, ribbon = (l .- u) ./ 2, fillalpha = 0.35, c = 1, label = "Confidence band")

(Здесь и обозначают «нижнее» и «верхнее» значения y, соответственно, и обозначают их общие значения x.) Ключевое различие между этими двумя методами состоит в том, что затемняет область между l и u, а аргумент - радиус , т.е. половина ширины ленты (или, другими словами, отклонение по вертикали от середины).

Пример использования :

      x = collect(range(0, 2, length= 100))
y1 = exp.(x)
y2 = exp.(1.3 .* x)

plot(x, y1, fillrange = y2, fillalpha = 0.35, c = 1, label = "Confidence band", legend = :topleft)

Давайте рассредоточим по верхнему краю графика, просто чтобы убедиться, что мы заполняем правильную область.

      plot!(x,y1, line = :scatter, msw = 0, ms = 2.5, label = "Lower bound")
plot!(x,y2, line = :scatter, msw = 0, ms = 2.5, label = "Upper bound")

Результат:

Пример использования :

      mid = (y1 .+ y2) ./ 2   #the midpoints (usually representing mean values)
w = (y2 .- y1) ./ 2     #the vertical deviation around the means

plot(x, mid, ribbon = w , fillalpha = 0.35, c = 1, lw = 2, legend = :topleft, label = "Mean")
plot!(x,y1, line = :scatter, msw = 0, ms = 2.5, label = "Lower bound")
plot!(x,y2, line = :scatter, msw = 0, ms = 2.5, label = "Upper bound")

(Здесь, x, y1, и y2 такие же, как и раньше.)

Результат:

Обратите внимание, что метки для ribbon и fillrange в легендах различаются: первая обозначает средние точки / средние значения, а вторая обозначает сам заштрихованный регион.

Некоторые дополнительные комментарии:

  1. ОП ответ plot(y, ribbon=(l,u), lab="estimate")неверно (по крайней мере, для Plots v1.10.1.). Я понимаю, что этому потоку более 3 лет, поэтому, возможно, он работал в более ранней версии Plots.jl, которую OP использовал в то время)

  2. Подобно одному из приведенных ответов,

      plot(x, [mid mid], fillrange=[mid .- w, mid .+ w], fillalpha=0.35, c = [1 4], label = ["Band 1" "Band 2"], legend = :topleft, dpi = 80)

будет работать, но это фактически создает ДВЕ ленты (и, следовательно, два значка в легенде), которые могут или не могут быть тем, что искал OP. Чтобы проиллюстрировать эту мысль:

Что-то вроде этого? (видно здесь).

plot([y y], fillrange=[y.-l y.+u], fillalpha=0.3, c=:orange)
plot!(y)

The fillrangeрешение в ответе @leonidas может привести к дополнительной граничной линии (по крайней мере, в Plots v1.35). Чтобы удалить такую ​​строку, обходным путем является указаниеlinealpha = 0, то есть,

      plot(x, l, fillrange = u, fillalpha = 0.35, c = 1, label = "Confidence band", linealpha = 0)
Другие вопросы по тегам