调用R中的多边形时禁止重绘(Suppress redraw when calling polygon

2019-07-22 05:16发布

我想在目前R.单个图绘制60,000+非重叠的三角形(非结构化三角形网格的一部分),它需要每小区,这使得不可能使用这种用于制造动画15-20分钟。 例如,

n <- 100 #Except replace this with 60,000
x <- matrix(runif(3*n), n)
y <- matrix(runif(3*n), n)
cols <- heat.colors(n)[order(x[,1])]
poly <- function(i) {polygon(x[i,], y[i,], col=cols[i])}
plot(0, xlim=c(min(x),max(x)), ylim=c(min(y),max(y)))
sapply(1:n, poly)

是否有可能从每一个多边形后重绘抑制多边形()? 我猜这是耗时的步骤的时间最多,而且它不是在手册页提及。 对于如何实现这一另类的建议,将不胜感激。 谢谢。

Answer 1:

你可以通过几个多边形polygon 。 所有你需要做的是独立的,然后用NA 。 这里的代码:

cuts <- function(x)
{
    n <- length(x) %/% 3

    map <- rep(c(TRUE,TRUE,TRUE,FALSE), n)

    result <- rep(NA, n*4)

    result[map] <- x

    result
}


set.seed(1234)

n <- 10000
x <- matrix(runif(3*n), n)
y <- matrix(runif(3*n), n)
cols <- heat.colors(n)[order(x[,1])]
plot(0, xlim=c(min(x),max(x)), ylim=c(min(y),max(y)))
polygon(x=cuts(t(x)), y=cuts(t(y)), col=cols)

工作快。 我测试过控制种子和与你的代码生成的情节比较。



Answer 2:

这里使用的矢量溶液grid.polygon所述的grid包。 我用的是lattice刚刚绘制场景( xyplot(0~0) plot(0)

library(lattice)
library(grid)
xyplot(0~0, xlim=c(min(x),max(x)), ylim=c(min(y),max(y)),
       panel=function(...)
       {
         grid.polygon(x  = as.vector(t(x)),
                      y  = as.vector(t(y)),
                      id = rep(1:n,each=3),
                      gp=gpar(fill=cols),
                      def='native')         
       })

这需要不到30秒,我微薄的PC生成60000个多边形。



文章来源: Suppress redraw when calling polygon in R
标签: r graphics