在R中调用多边形时禁止重绘

时间:2013-03-20 20:28:14

标签: r graphics

我想在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)

是否可以在每个多边形之后禁止重绘多边形?我猜这是最耗时的步骤,并且在手册页中没有提到。关于如何实现这一目标的替代建议将不胜感激。谢谢。

2 个答案:

答案 0 :(得分:4)

您可以将多个多边形传递给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)

快速工作。我已经测试了控制种子并与代码生成的图表进行比较。

答案 1 :(得分: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')         
       })

在我的适度PC中生成60000多边形只需不到30秒。