我正在尝试通过stat_contour()
向我的ggplot
/ 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_contour()
这会导致以下错误消息:
if(nrow(layer_data)== 0)return()出错:参数是长度的 零另外:警告消息:无法生成轮廓 数据
该示例与stackoverflow或官方手册/教程中发布的其他示例没有什么不同,如果我向stat_contour
提供更多规范,那么seeminlgy无关紧要。看来,该函数没有按照错误消息的指示传递数据(-layer)。
感谢您的意见和建议!
答案 0 :(得分:8)
使用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()
)
答案 1 :(得分:7)
该问题的一个解决方案是生成规则网格以及关于该网格的点值的插值。以下是我为多个数据字段中的一个执行此操作的方法:
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中使用,当在该函数的data-parameter中定义时:
(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 :(得分:2)
您应该使用expand.grid
或outer
为x和y的每个组合生成一个z。例如:
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))
)