【问题标题】:Minimizing the distance between curves stacked on each other in R plot最小化R图中相互堆叠的曲线之间的距离
【发布时间】:2018-05-21 23:00:34
【问题描述】:

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

不过,我想知道如何调整曲线之间的距离(see 蓝色箭头),使曲线看起来不那么平坦?

另外,是否可以使用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"))

【问题讨论】:

    标签: r function plot polygon


    【解决方案1】:

    您可以在绘制线条之前缩放 y 值。我在您的函数中添加了一个scale 参数。试试 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)
      }
    

    【讨论】:

      猜你喜欢
      • 2023-01-28
      • 1970-01-01
      • 2018-05-21
      • 1970-01-01
      • 2021-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-03
      相关资源
      最近更新 更多