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