Как заполнить область между кривыми с помощью 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
в легендах различаются: первая обозначает средние точки / средние значения, а вторая обозначает сам заштрихованный регион.
Некоторые дополнительные комментарии:
ОП ответ
plot(y, ribbon=(l,u), lab="estimate")
неверно (по крайней мере, для Plots v1.10.1.). Я понимаю, что этому потоку более 3 лет, поэтому, возможно, он работал в более ранней версии Plots.jl, которую OP использовал в то время)Подобно одному из приведенных ответов,
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)