построение и раскрашивание данных на неравномерной сетке

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

введите здесь описание изображения

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

В идеале решение должно

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

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

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


person baptiste    schedule 09.04.2011    source источник


Ответы (2)


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

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

person baptiste    schedule 11.04.2011
comment
Что вы подразумеваете под правильными цветами? Вы все еще пытаетесь получить правильный оттенок серого, прикрепленный к правильной плитке? Если да, то помогает ли @plotOrder слот Z? Под этим я подразумеваю plot(Z, col=grey(d$z/max(d$z))[Z@plotOrder]) - person Gavin Simpson; 11.04.2011
comment
Действительно, я попробовал это, прежде чем понял, что реальная проблема заключается в том, что плиток Делоне больше, чем значений z. Попробуйте приведенный выше пример с delaunay(), Y ‹- delaunay(X) Z ‹- as(Y, SpatialPolygons) plot(Z, col=grey(d$z/max(d$z))[Z@plotOrder]) плиткам назначается неправильный цвет. Мне понадобится какая-то интерполяция между соседними плитками/точками. - person baptiste; 12.04.2011

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

введите здесь описание изображения

person baptiste    schedule 20.03.2016