2017-02-10 1 views
1

У меня есть несколько точек в единичном круге в 2D. Точки (красный, зеленый) исходят из одного из двух классов.двунаправленная меж- и экстраполяция для создания тепловой карты, которая заполняет круг

library(plotrix) 

# draw points within circle 
n <- 100 
d <- data.frame(x= rnorm(n), 
       y= rnorm(n)) 
d <- d[sqrt(d$x^2 + d$y^2) < 1, ] 
d$value <- ifelse(d$x > 0, 2, 3) 
plot(d$x, d$y, xlim=c(-1,1), ylim=c(-1,1), pch=16, asp=1, col=d$value) 
draw.circle(0,0,1) 

enter image description here

Теперь я хочу, чтобы перекрывать участок с гладкой тепловой карты с указанием региона для каждой группы.

library(akima) 
library(scales) 

# estimate surface 
nxy <- 100 
xyo <- seq(-1, 1, len=nxy) 
int <- interp(x = d$x, y = d$y, z = d$value, 
         extrap = T, 
         xo = xyo, yo = xyo, 
         nx = nxy, ny=nxy, 
         linear = T) 
colors <- alpha(colorRampPalette(c("red", "yellow", "green"))(40) , .4) 
image(xyo, xyo, int$z, add = T, col = colors) 

enter image description here

До сих пор так хорошо. Моя проблема заключается в том, чтобы найти способ экстраполяции карты тепла к краям круга, чтобы она заполнила весь круг. Существует аргумент extrap. В документах говорится: logical flag: should extrapolation be used outside of the convex hull determined by the data points?. Я установил его на TRUE, однако это, похоже, не работает.

Любые идеи, как оценить гладкую поверхность, покрывающую весь круг?

+0

'packageVersion ("Аким")'? –

+0

'akima' Версия 0.6-2 –

+0

Хорошо, я нашел причину в деталях:' Никакой экстраполяции не может быть выполнено для линейного случая. 'Ну, лучше RTFM :) –

ответ

0

Понимая, что для экстраполяции требуется linear=FALSE, решение является несгибаемым. Сначала мы можем нарисовать экстраполированные значения для всего прямоугольника.

library(akima) 
library(plotrix) 
library(scales) 

plot(d$x, d$y, xlim=c(-1,1), ylim=c(-1,1), pch=16, asp=1, col=d$value) 
draw.circle(0,0,1) 

# estimate surface 
nxy <- 100 
xyo <- seq(-1, 1, len=nxy) 
int <- interp(x = d$x, y = d$y, z = d$value, 
         extrap = T, 
         xo = xyo, yo = xyo, 
         nx = nxy, ny=nxy, 
         linear = F) 
z <- int$z 

# extrapolation with tweaking of color breaks 
colors <- alpha(colorRampPalette(c("red", "yellow", "green"))(21), .4) 
br <- seq(2.3, 2.7, len=20) 
image(xyo, xyo, z, add = T, col = colors, breaks=c(0, br, 5)) 

enter image description here

На последнем этапе, пиксели вне круга должны быть удалены, чтобы получить окончательный сюжет.

plot(d$x, d$y, xlim=c(-1,1), ylim=c(-1,1), pch=16, asp=1, col=d$value) 
draw.circle(0,0,1) 

# remove values outside circle 
inside <- outer(xyo, xyo, FUN = function(x,y) sqrt(x^2 + y^2) < 1) 
z[!inside] <- NA 
plot(d$x, d$y, xlim=c(-1,1), ylim=c(-1,1), pch=16, asp=1, col=d$value) 
draw.circle(0,0,1) 
colors <- alpha(colorRampPalette(c("red", "yellow", "green"))(21), .4) 
br <- seq(2.3, 2.7, len=20) 
image(xyo, xyo, z, add = T, col = colors, breaks=c(0, br, 5)) 

enter image description here