данные построения и раскраски на нерегулярной сетке - PullRequest
10 голосов
/ 10 апреля 2011

У меня есть данные в форме (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

Однако это приводит к потере информации о начальной сетке (положение точек с фактическими данными), которые могут быть очень точными или очень грубыми в определенных местах.Я предпочел бы мозаику Делоне с треугольниками, которая точно представляет фактическое местоположение и плотность исходных точек данных.

В идеале решение будет

  • вычислять тесселяцию вне функции построения графика, так что результирующие полигоны могут быть построены либо с помощью ggplot2, lattice, либобазовая графика

  • Быстро.В моем реальном примере (~ 1e5 баллов) вычисление тесселяции с помощью deldir может быть очень медленным.

Под «тесселяцией» я подразумеваю либо треугольники Делоне, либо диаграммы Вороного, хотя мое предпочтение было бы для первого.Однако это приносит дополнительную сложность интерполяции цвета каждого треугольника на основе исходных точек данных.

Ответы [ 2 ]

4 голосов
/ 11 апреля 2011

Вот решение на основе 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.

Также, если есть простой способ получить «правильные» цвета для ассоциированного тесселяции Делоне, я бы хотел это услышать.

2 голосов
/ 20 марта 2016

Вот решеточное решение с использованием 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

...