如何使用 Plots.jl 填充曲线之间的区域?

jul*_*ohm 4 julia plots.jl

假设我有一条曲线y和另外两条曲线ul它们是向量的形式。如何绘图:

plot(y, lab="estimate")
plot!(y-l, lab="lower bound")
plot!(y+u, lab="upper bound")
Run Code Online (Sandbox Code Playgroud)

也就是说,一个不对称的置信区间?我知道如何使用此处ribbon解释的选项绘制对称情况。

jul*_*ohm 6

事实证明,该选项ribbon接受下限和上限:

plot(y, ribbon=(l,u), lab="estimate")
Run Code Online (Sandbox Code Playgroud)

注意,通过使luribbon选项中,填充的区域将对应于区域之间y-ly+u。换句话说,l并且u应该是平均曲线的“偏差” y


Ale*_*ley 5

像这样的东西?(见这里)。

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


Leo*_*das 5

当前的答案正确。这里有两种方法都是正确的(如Plots.jl的v1.10.1的):

方法一:使用fillrange

plot(x, l, fillrange = u, fillalpha = 0.35, c = 1, label = "Confidence band")
Run Code Online (Sandbox Code Playgroud)

方法二:使用ribbon

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

(这里,lu分别表示“下”和“上” y 值,并x表示它们共同的 x 值。)这两种方法之间的主要区别在于对和fillrange之间的区域进行了阴影处理,而参数是半径,即色带宽度的一半(或换句话说,与中点的垂直偏差)。luribbon

使用示例 fillrange

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)
Run Code Online (Sandbox Code Playgroud)

让我们分散y1y2对剧情的顶部,只是为了确保我们在正确的区域正在填充。

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")
Run Code Online (Sandbox Code Playgroud)

结果:

在此处输入图片说明

使用示例 ribbon

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")
Run Code Online (Sandbox Code Playgroud)

(此处的 、xy1y2与之前相同。)

结果:

在此处输入图片说明

请注意,图例中ribbon和的标签fillrange不同:前者标记中点/均值,而后者标记阴影区域本身。

一些补充意见:

  1. OP 的答案plot(y, ribbon=(l,u), lab="estimate")不正确(至少对于 Plots v1.10.1。)。我意识到这个线程已经超过 3 年了,所以它可能在 OP 当时使用的早期版本的 Plots.jl 中有效)

  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)
Run Code Online (Sandbox Code Playgroud)

会起作用,但这实际上会创建两个色带(因此,图例中有两个图标),这可能是也可能不是 OP 正在寻找的。为了说明这一点:

在此处输入图片说明