不规则网格上的绘图和着色数据

时间:2011-04-09 22:32:40

标签: r delaunay voronoi spatstat tesselation

我有(x,y,z)形式的数据,其中x和y不在常规网格上。我希望显示这些数据的2D色彩图,其中强度(例如,灰度)映射到z变量。一个明显的解决方案是在常规网格上插入(见下文),

d <- data.frame(x=runif(1e3, 0, 30), y=runif(1e3, 0, 30))
d$z = (d$x - 15)^2 + (d$y - 15)^2


library(akima)
d2 <- with(d, interp(x, y, z, xo=seq(0, 30, length = 30),
                     yo=seq(0, 30, length = 50), duplicate="mean"))

pal1 <- grey(seq(0,1,leng=500))
with(d2, image(sort(x), sort(y), z, useRaster=TRUE, col = pal1))
points(d$x, d$y, col="white", bg=grey(d$z/max(d$z)), pch=21, cex=1,lwd=0.1)

enter image description here

但是,这会丢失初始网格的信息(点与实际数据的位置),这些信息在某些位置可能非常精细或非常粗糙。我倾向于使用三角形进行delaunay平铺,这准确地表示原始数据点的实际位置和密度。

理想情况下,解决方案

  • 计算绘图函数之外的tesselation,以便可以使用ggplot2lattice或基本图形

  • 绘制生成的多边形
  • 快点。在我的实际例子中(~1e5分),通过deldir计算细分可能非常慢。

“tesselation”我指的是Delaunay三角形或Voronoi图,尽管我的偏好是前者。然而,它带来了基于原始数据点插入每个三角形颜色的额外复杂性。

2 个答案:

答案 0 :(得分:4)

以下是基于dirichlet包中的maptools

的解决方案
d <- data.frame(x=runif(1e3, 0, 30), y=runif(1e3, 0, 30))
d$z = (d$x - 15)^2 + (d$y - 15)^2

library(spatstat) 
library(maptools)

W <- ripras(df, shape="rectangle") 
W <- owin(c(0, 30), c(0, 30)) 
X <- as.ppp(d, W=W) 
Y <- dirichlet(X) 
Z <- as(Y, "SpatialPolygons") 
plot(Z, col=grey(d$z/max(d$z)))

dirichlet

我仍然不确定从这个SpatialPolygons类中提取多边形的方法。

此外,如果有一种简单的方法可以为相关的delaunay tesselation产生“正确”的颜色,我想听听它。

答案 1 :(得分:2)

这是使用deldir

的点阵解决方案
d <- data.frame(x=runif(1e3, 0, 30), y=runif(1e3, 0, 30))
d$z = (d$x - 15)^2 + (d$y - 15)^2

pal1 <- grey(seq(0,1,leng=500))
library(latticeExtra)

 levelplot(z~x*y, data=d,
           panel = function(...) panel.voronoi(..., points=FALSE),
           interpolate=TRUE,
           col.regions = colorRampPalette(pal1)(1e3), cut=1e3)

enter image description here