4

Rの1つのプロットに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)

すべてのポリゴンの後にpolygon()が再描画されないようにすることは可能ですか?これが最も時間のかかる手順だと思いますが、manページには記載されていません。これを達成する方法についての代替案をいただければ幸いです。ありがとうございました。

4

2 に答える 2

5

複数のポリゴンを に渡すことができます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)

高速に動作します。シードの制御と、コードによって生成されたプロットとの比較をテストしました。

于 2013-03-20T21:15:11.507 に答える
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秒もかかりません。

于 2013-03-20T21:05:44.453 に答える