20

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),因为指出了错误消息的颜色。

4

3 回答 3

12

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

在此处输入图像描述

于 2013-09-29T13:35:06.530 回答
8

该问题的一种解决方案是生成规则网格并相对于该网格对点值进行插值。以下是我对多个数据字段之一的处理方式:

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)

stat_contour()这会产生一个数据框,当在该函数的数据参数中定义时,该数据框可以在 ggplot 中使用:

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

这个解决方案很可能包括不必要的转换,因为我还不知道更好。此外,我必须为每个数据字段单独生成相同的网格,然后再将它们组合到单个数据帧中 - 不如我希望的对于更大数据集的效率那么高。

于 2013-09-29T13:53:42.523 回答
2

expand.grid您应该使用or为 x 和 y 的每个组合生成 az 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))
)

在此处输入图像描述

于 2013-09-28T11:37:39.037 回答