как нарисовать заполненный график .contour с data.frame из 3 переменных в R (без обычной сетки)?

(Извините, если мой английский не идеален... :-s)

Мой вопрос почти такой же, как и в этой теме: Создание заполненного контурный график с использованием данных в списках

Но разница в том, что я хотел бы отображать плотность, соответствующую моим координатам (x, y), только в одном направлении! Я объясняю: у меня есть такой data.frame:

X <- matrix(c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3), nrow=4)
Y <- matrix(c(-1.0190, -0.9617, -0.9044, -0.8470, -1.0617, -0.9641, -0.8664, -0.7688,  0.4623, 0.6012,  0.7401,  0.8790), nrow=4)
Z <- matrix(c(3.9216,  3.9216,  3.9216, 11.7647,  1.9608,  1.9608,  1.9608, 11.7647,  1.9608, 1.9608,  9.8039,  9.8039), nrow=4)
Niveau <- data.frame(X=c(X),Y=c(Y),Z=c(Z))

X представляет координаты x, Y координаты y и Z плотность в процентах только в направлении Y. Для каждой координаты x я рассчитал плотность в направлении Y. И результат в векторе Z. Вы можете видеть, что это не обычная сетка в (x, y). И я хотел бы построить «контурный график» плотности Z, но пока мне это не удалось... Я попробовал эту команду:

ggplot(Niveau, aes(x=X, y=Y, z=Z)) + geom_density2d()

Но он отображает плотность в направлении x AND y, а я хочу только в направлении Y. Когда я попробовал команду:

filled.contour(t(Z), nlevels=10)

Он не учитывает координаты (x, y). И невозможно реализовать:

filled.contour(X,Y,Z, nlevels=10)

После некоторых исследований я нахожу эту тему, и моя проблема такая же: Как нарисовать контурную диаграмму, если данные расположены не на регулярной сетке?

Но ответ не соответствует: решение представляет собой «регулярную сетку» в (x, y), а это не то, что у меня есть! Кто-нибудь может помочь?

Спасибо !


person sandikou    schedule 30.08.2013    source источник
comment
Вы можете адаптировать этот ответ: stackoverflow.com/questions/8508059/   -  person Ben Bolker    schedule 30.08.2013
comment
Спасибо !!! Оно работает !! С тех пор, как я искал... Вот что я сделал: my.heat.colors ‹- function(x) { rev(heat.colors(x, alpha=1)) } my.matrix ‹- interp(X, Y,Z, length=500) ind.mat.na ‹- which(is.na(c(my.matrix$z))) my.matrix$z[ind.mat.na] ‹- 0 fill.contour( my.matrix, nlevels=10, color=my.heat.colors) А теперь я буду строить контуры на этом. Еще раз спасибо!   -  person sandikou    schedule 30.08.2013
comment
Поздравляю с решением собственной проблемы (с подсказкой). Будет хорошей формой и повысит вашу репутацию в StackOverflow, если вы опубликуете свое решение в качестве ответа (возможно, вам придется подождать несколько часов - я не уверен).   -  person Ben Bolker    schedule 30.08.2013
comment
Завтра выложу :-)   -  person sandikou    schedule 30.08.2013


Ответы (1)


Спасибо !!! Оно работает !! С тех пор, как я искал...

Вот что я сделал:

 library(akima)
 my.heat.colors <- function(x) { rev(heat.colors(x, alpha=1)) }
 my.matrix  <- interp(X,Y,Z)
 ind.mat.na <- which(is.na(c(my.matrix$z)))
 my.matrix$z[ind.mat.na] <- 0
 filled.contour(my.matrix, nlevels=10, color=my.heat.colors)

А теперь я нарисую контуры на этом.

Еще раз спасибо!

person sandikou    schedule 30.08.2013