最小化 R 图中相互堆叠的曲线之间的距离

Minimizing the distance between curves stacked on each other in R plot

我有一个 R 函数,可以绘制一些堆叠在一起的曲线(请参见代码下方的图片)。

不过,我想知道如何调整曲线之间的距离(see blue arrows)以便曲线别看这么扁平?

此外,是否可以使用 polygon 而不是 lines 来绘制这些曲线?

stacked = function(a, b, lo, hi, d, Bi = 55, n = 1e2){

h = list()

for(i in 1:length(d)){
         p = function(x) get(d[i])(x, a, b)
     prior = function(x) p(x)/integrate(p, lo, hi)[[1]]
likelihood = function(x) dbinom(Bi, n, x)
 posterior = function(x) prior(x)*likelihood(x)
      h[i] = list(curve(posterior, ty = "n", ann = FALSE, yaxt = "n", xaxt = "n", add = i!= 1, bty = "n", n = 1e3))
}
plot(matrix(c(rep(c(.4, .8), each = length(d))), length(d), 2), rep(1:length(d), 2), ty = "n", xlim = 0:1, ann = FALSE, xaxt = "n", ylim = c(1, length(d)+.4))

for(i in 1:length(d)){
lines(h[[i]]$x, h[[i]]$y+i, ty = "l", xpd = NA, col = i)
  }
}
# Example of use:
stacked(lo = 0, hi = 1, a = 2, b = 3, d = c("dgamma", "dnorm", "dcauchy", "dbeta", "dlogis", "dweibull"))

您可以在绘制线条之前缩放 y 值。我在您的函数中添加了一个 scale 参数。尝试比例 =2 或 3

stacked = function(a, b, lo, hi, d, Bi = 55, n = 1e2, scale=1){

    h = list()
    for(i in 1:length(d)) {
             p = function(x) get(d[i])(x, a, b)
         prior = function(x) p(x)/integrate(p, lo, hi)[[1]]
    likelihood = function(x) dbinom(Bi, n, x)
     posterior = function(x) prior(x)*likelihood(x)
          h[i] = list(curve(posterior, ty = "n", ann = FALSE, yaxt = "n", xaxt = "n", add = i!= 1, bty = "n", n = 1e3))
    }
    plot(matrix(c(rep(c(.4, .8), each = length(d))), length(d), 2), rep(1:length(d), 2), ty = "n", xlim = 0:1, ann = FALSE, xaxt = "n", ylim = c(1, length(d)+.4))

    for(i in 1:length(d)){
        lines(h[[i]]$x, scale*h[[i]]$y+i, ty = "l", xpd = NA, col = i)
      }
}

stacked(lo = 0, hi = 1, a = 2, b = 3, scale=2,
    d = c("dgamma", "dnorm", "dcauchy", "dbeta", "dlogis", "dweibull"))

如果要填充曲线下的区域,可以使用polygon。更改行:

for(i in 1:length(d)){
        lines(h[[i]]$x, scale*h[[i]]$y+i, ty = "l", xpd = NA, col = i)
      }

for(i in 1:length(d)){
    polygon(x=h[[i]]$x, y=scale*h[[i]]$y+i, col = i)
  }