如何用 Plots.jl 填充曲线之间的区域?
How to fill area between curves with Plots.jl?
假设我有一条曲线 y
,以及另外两条曲线 u
和 l
的向量形式。如何绘制:
plot(y, lab="estimate")
plot!(y-l, lab="lower bound")
plot!(y+u, lab="upper bound")
也就是说,一个不对称的置信区间?我知道如何使用选项 ribbon
绘制对称案例,如 here.
所述
是这样的吗? (看过 here)。
plot([y y], fillrange=[y.-l y.+u], fillalpha=0.3, c=:orange)
plot!(y)
事实证明选项ribbon
接受上下界:
plot(y, ribbon=(l,u), lab="estimate")
注意,通过在ribbon
选项中传递l
和u
,填充区域将对应于y-l
和y+u
之间的区域。换句话说,l
和 u
应该是平均曲线 y
.
的 "deviations"
当前答案不正确。以下是 正确的两种方式(从 Plots.jl 的 v1.10.1 开始):
方法一:使用fillrange
plot(x, l, fillrange = u, fillalpha = 0.35, c = 1, label = "Confidence band")
方法二:使用ribbon
plot(x, (l .+ u) ./ 2, ribbon = (l .- u) ./ 2, fillalpha = 0.35, c = 1, label = "Confidence band")
(这里,l
和 u
分别表示“较低”和“较高”y 值,x
表示它们共同的 x 值。)关键区别这两种方法之间的区别在于 fillrange
遮蔽 l
和 u
之间的区域,而 ribbon
参数是 radius,即色带宽度的一半(或者换句话说,与中点的垂直偏差)。
示例使用 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)
让我们在图的顶部散布 y1
和 y2
,以确保我们填充的区域正确。
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")
结果:
示例使用 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")
(这里的x
、y1
、y2
同前)
结果:
请注意 ribbon
和 fillrange
的标签在图例中是不同的:前者标签为 midpoints/means,而后者标签为阴影区域本身。
一些补充意见:
OP 的 plot(y, ribbon=(l,u), lab="estimate")
答案不正确(至少对于 Plots v1.10.1.)。我意识到这个线程已经超过 3 年了,所以它可能在 OP 当时使用的 Plots.jl 的早期版本中工作)
类似于给出的答案之一,
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 所寻找的。为了说明这一点:
假设我有一条曲线 y
,以及另外两条曲线 u
和 l
的向量形式。如何绘制:
plot(y, lab="estimate")
plot!(y-l, lab="lower bound")
plot!(y+u, lab="upper bound")
也就是说,一个不对称的置信区间?我知道如何使用选项 ribbon
绘制对称案例,如 here.
是这样的吗? (看过 here)。
plot([y y], fillrange=[y.-l y.+u], fillalpha=0.3, c=:orange)
plot!(y)
事实证明选项ribbon
接受上下界:
plot(y, ribbon=(l,u), lab="estimate")
注意,通过在ribbon
选项中传递l
和u
,填充区域将对应于y-l
和y+u
之间的区域。换句话说,l
和 u
应该是平均曲线 y
.
当前答案不正确。以下是 正确的两种方式(从 Plots.jl 的 v1.10.1 开始):
方法一:使用fillrange
plot(x, l, fillrange = u, fillalpha = 0.35, c = 1, label = "Confidence band")
方法二:使用ribbon
plot(x, (l .+ u) ./ 2, ribbon = (l .- u) ./ 2, fillalpha = 0.35, c = 1, label = "Confidence band")
(这里,l
和 u
分别表示“较低”和“较高”y 值,x
表示它们共同的 x 值。)关键区别这两种方法之间的区别在于 fillrange
遮蔽 l
和 u
之间的区域,而 ribbon
参数是 radius,即色带宽度的一半(或者换句话说,与中点的垂直偏差)。
示例使用 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)
让我们在图的顶部散布 y1
和 y2
,以确保我们填充的区域正确。
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")
结果:
示例使用 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")
(这里的x
、y1
、y2
同前)
结果:
请注意 ribbon
和 fillrange
的标签在图例中是不同的:前者标签为 midpoints/means,而后者标签为阴影区域本身。
一些补充意见:
OP 的
plot(y, ribbon=(l,u), lab="estimate")
答案不正确(至少对于 Plots v1.10.1.)。我意识到这个线程已经超过 3 年了,所以它可能在 OP 当时使用的 Plots.jl 的早期版本中工作)类似于给出的答案之一,
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 所寻找的。为了说明这一点: