Построение и раскрашивание данных по нерегулярной сетке
У меня есть данные в форме (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 tiling с треугольниками, который точно отражает фактическое местоположение и плотность исходных точек данных.
В идеале решение было бы
-
вычислить тесселяцию вне функции построения графика, чтобы полученные полигоны могли быть построены с помощью ggplot2
, lattice
или базовой графики
-
Быстро. В моем реальном примере (~ 1e5 баллов) вычисление тесселяции через deldir
может быть очень медленным.
Под "тесселяцией" я имею в виду треугольники Делоне или диаграммы Вороного, хотя мое предпочтение было бы для первого. Однако это придает дополнительную сложность интерполяции цвета каждого треугольника на основе исходных точек данных.
Ответы
Ответ 1
Здесь решение на основе 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, я бы хотел его услышать.
Ответ 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)
![введите описание изображения здесь]()