【问题标题】:Plotting line segments on top of a plot from a previous run of an R function在先前运行 R 函数的绘图顶部绘制线段
【发布时间】:2017-12-09 22:44:28
【问题描述】:

我有一个名为stock 的R 函数(如下)。我想知道是否有可能以任何方式将函数的每次运行的结果(即plot())绘制(即添加)在上一次函数运行的绘图之上? (代码下方的图片可能会显示这一点)

stock = function(m, s){

 loop = length(s) 

 I = matrix(NA, loop, 2)

for(i in 1:loop){
I[i,] = quantile(rbeta(1e2, m, s[i]), c(.025, .975))
 }
plot(rep(1:loop, 2), I[, 1:2], ty = "n", ylim = 0:1, xlim = c(1, loop))

segments(1:loop, I[, 1], 1:loop, I[, 2])
}
# Example of use:
stock(m = 2, s = c(1, 10, 15, 20, 25, 30))
stock(m = 50, s = c(1, 10, 15, 20, 25, 30)) #The result of this run be plotted on top of previous run above

【问题讨论】:

  • 实际上,第一次和第二次运行的图会相互重叠。您会将它们视为一行,而不是两行。
  • 是的,我明白了。但是第二个图的 y 值不高于第一个图。将它们都绘制出来,您会发现,如果将它们一起绘制在一个图中,它将看起来像一条线,而不是一条线在另一条线之上。是否要随意将第二个上移?

标签: r function for-loop plot vectorization


【解决方案1】:

最简单的方法是为选项添加一个参数。由于segments() 默认添加到前一帧,您所要做的就是不要创建新的plot()。

stock = function(m, s, add=FALSE) {

    loop = length(s) 
    I = matrix(NA, loop, 2)

    for(i in 1:loop) {
        I[i,] = quantile(rbeta(1e2, m, s[i]), c(.025, .975))
    }
    if (!add) {
        plot(rep(1:loop, 2), I[, 1:2], ty = "n", ylim = 0:1, xlim = c(1, loop))
    }
    segments(1:loop, I[, 1], 1:loop, I[, 2], xpd = NA)
}

# Example of use:
set.seed(1)
stock(m = 2, s = c(1, 10, 15, 20, 25, 30))
stock(m = 50, s = seq(1, 90, 10), add=TRUE)

【讨论】:

    猜你喜欢
    • 2018-10-02
    • 2012-07-04
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    • 1970-01-01
    • 2014-11-21
    相关资源
    最近更新 更多