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()

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

Ошибка в if (nrow (layer_data) == 0) return(): аргумент имеет нулевую длину. Дополнительно: предупреждающее сообщение: невозможно создать данные контура

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

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

Ответ 1

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

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()
)

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

Ответ 2

Используйте 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()
)

enter image description here

Ответ 3

Вы должны сгенерировать 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))
)

enter image description here