我的数据格式为 (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)
然而,这会丢失初始网格的信息(具有实际数据的点的位置),在某些位置可能非常精细或非常粗糙。我更喜欢使用三角形的 delaunay 平铺,它可以准确地表示原始数据点的实际位置和密度。
理想的解决方案是
在绘图函数之外计算曲面细分,以便可以使用以下任一方法绘制生成的多边形ggplot2
, lattice
,或基础图形
快点。在我的现实生活示例中(~1e5 点),通过以下方式计算曲面细分deldir
可能真的很慢。
我所说的“镶嵌”是指 Delaunay 三角形或 Voronoi 图,尽管我更喜欢前者。然而,它带来了基于原始数据点插值每个三角形颜色的额外复杂性。