如何在R中使用闪亮的动画来更改绘图上的数据而不重绘绘图本身?

时间:2017-07-20 19:58:01

标签: r animation optimization shiny

我正在研究和比较各种版本的粒子群优化和差分进化,并帮助我可视化每个变体的收敛,我开发了一个简单的闪亮应用程序。我的闪亮应用程序绘制了G2功能的等高线图(下面的代码),然后使用简单的动画,它添加了每一代'人口作为轮​​廓图上的点,所以我可以看到几代人的进化。我注意到动画中的延迟是每次都在重新绘制轮廓图的闪亮应用程序中,而不仅仅是"删除"当前的数据点,并在它循环几代时向图中添加新的数据点。如果我在动画参数的animationOptions()中低于interval = 400,则它不会渲染得更快,因为它似乎是最快的重绘轮廓图和数据点。有没有办法让轮廓图只绘制一次,然后在循环生成时添加和删除数据点?

G2 = function(x) {
     if (x[1] >= 0 & x[1] <= 10 & x[2] >= 0 & x[2] <= 10 &
         x[1] * x[2] >= 0.75 & x[1] + x[2] <= 15) {
         s <- cos(x[1]) ^ 4 + cos(x[2]) ^ 4
         p <- 2 * cos(x[1]) ^ 2 * cos(x[2]) ^ 2
         r <- sqrt(x[1] ^ 2 + 2 * x[2] ^ 2)
         f <- -abs((s - p) / r)
     } else {
         f <- 0
     }
     return(f)
     }





plotG2 <- function(main = "", sub = "") {
        S <- matrix(0, 101, 101)
        x1 <- (1:101 - 1) / 10
        x2 <- x1
        for (i in 1:101) {
            for (j in 1:101) {
                f <- -G2(c(x1[i], x2[j]))
                #f <- -rosenbrock(1, 100, c(x1[i], x2[j]))
                S[i, j] <- f
            }
        }

        col = terrain.colors(100)
        crange <- max(S) - min(S)
        image(x1, x2, S, col = terrain.colors(100), axes = T,
        xlab = "", ylab = "")
        contour(x1, x2, S, col = col[100], lty = "solid", add = TRUE,
        levels = c(0.05, 0.1, 0.2, 0.3, 0.4), vfont = c("sans serif",
        "plain"), drawlabels = F)
        title(main = main, sub = sub)
    }



 #Create list of random data points to cycle through
 popList = list()
     for (i in 1:5) {
          popList[[i]] = matrix(runif(80, 0, 10), nrow = 2, ncol = 40)
          }


library(shiny)

server <- function(input, output) {
    output$distPlot <- renderPlot({
            plotG2(paste("G2 iter ", input$obs, sep = ""), "Particle Swarm Optimization")
            points(t(popList[[input$obs]]), col = "blue", pch = 19)

    })
}

ui <- fluidPage(
        sidebarLayout(
            sidebarPanel( 
                sliderInput("obs", "Number of observations:", min = 1,
                            max = 5, value = 1, step = 1, 
                            animate = animationOptions(interval = 400, loop = TRUE))
         ),
    mainPanel(plotOutput("distPlot"))
  )
)


shinyApp(ui = ui, server = server)

1 个答案:

答案 0 :(得分:0)

不,你不能。

很长的答案:在将插图插入Web界面之前,绘图将呈现为png(请参阅?plotPNG)。因此,如果您在绘图上更改某些内容,则不得不重新呈现要显示的整个图像。