R - ggplot - stat_contour не может генерировать контурные линии

Я пытаюсь добавить контурные линии через stat_contour() на мой ggplot/ggplot2-plot. К сожалению, я не могу дать вам реальные данные, по которым следует оценивать значения баллов. Тем не менее, другой легко представимый пример ведет себя так же:

testPts <- data.frame(x=rep(seq(7.08, 7.14, by=0.005), 200))
testPts$y <- runif(length(testPts$x), 50.93, 50.96)
testPts$z <- sin(testPts$y * 500)

(ggplot(data=testPts, aes(x=x, y=y, z=z))
+ geom_point(aes(colour=z))
+ stat_contour()
)

Это приводит к следующему сообщению об ошибке:

Error in if (nrow(layer_data) == 0) return() : argument is of length zero
In addition: Warning message:
Not possible to generate contour data 

Пример выглядит не так, как другие, опубликованные в stackru или в официальном руководстве / учебнике для меня, и, похоже, не имеет значения, если я предоставлю больше спецификаций для stat_contour, Похоже, что функция не передает данные (-layer), как указано выше, в сообщении об ошибке.

Спасибо за ваши идеи и советы!

3 ответа

Решение

Одним из решений этой проблемы является создание регулярной сетки и интерполяция значений точек относительно этой сетки. Вот как я сделал это только для одного из нескольких полей данных:

pts.grid <- interp(as.data.frame(pts)$coords.x1, as.data.frame(pts)$coords.x2, as.data.frame(pts)$GWLEVEL_TI)
pts.grid2 <- expand.grid(x=pts.grid$x, y=pts.grid$y)
pts.grid2$z <- as.vector(pts.grid$z)

Это приводит к кадру данных, который может быть использован в ggplot в stat_contour() когда определено в параметре данных этой функции:

(ggplot(as.data.frame(pts), aes(x=coords.x1, y=coords.x2, z=GWLEVEL_TI))
#+ geom_tile(data=na.omit(pts.grid2), aes(x=x, y=y, z=z, fill=z))
+ stat_contour(data=na.omit(pts.grid2), binwidth=2, colour="red", aes(x=x, y=y, z=z))
+ geom_point()
)

Это решение, скорее всего, включает в себя ненужные преобразования, потому что я еще не знаю лучше. Более того, я должен сделать одно и то же создание сетки для каждого поля данных индивидуально, прежде чем снова объединить их в один фрейм данных - не так эффективно, как хотелось бы для больших наборов данных.

Использование stat_density2d вместо stat_contour с нерегулярно расположенными данными.

library(ggplot2)

testPts <- data.frame(x=rep(seq(7.08, 7.14, by=0.005), 200))
testPts$y <- runif(length(testPts$x), 50.93, 50.96)
testPts$z <- sin(testPts$y * 500)

(ggplot(data=testPts, aes(x=x, y=y, z=z))
+ geom_point(aes(colour=z))
+ stat_density2d()
)

Вы должны сгенерировать a z для каждой комбинации x и y, используя expand.grid или же outer, Например:

library(ggplot2)
testPts <- transform(expand.grid(x=1:10,y=1:5),z=sin(x*y))
(ggplot(data=testPts, aes(x=x, y=y, z=z))
 + stat_contour()
 + geom_point(aes(colour=z))
)

Другие вопросы по тегам