R - ggplot - stat_contour无法生成轮廓线

Flo*_*ein 17 r contour ggplot2

我试图通过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()
Run Code Online (Sandbox Code Playgroud)

这会导致以下错误消息:

if(nrow(layer_data)== 0)return()中的错误:参数长度为零另外:警告消息:无法生成轮廓数据

该示例与stackoverflow或官方手册/教程中发布的其他示例没有什么不同,如果我提供更多规范,seeminlgy无关紧要stat_contour.看来,该函数不会像错误消息所指示的那样传递数据(-layer).

感谢您的想法和建议!

And*_*y W 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()
)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 您可能想要插值Z值(例如反距离加权,克里金法),而不是进行密度估计.您可能必须在`ggplot`之外执行此操作,然后添加图层.有关反距离权重的示例,请参阅[此处](http://stats.stackexchange.com/a/38658/1036). (3认同)
  • 我不同意 stat_density2d 是他想要的。stat_density2d 中的等高线给出了每个网格区域的点密度。@FlorianR.Klein 要求通过相等 z 的等高线,例如高程等高线。 (3认同)
  • 例如,当预先定义时,Id不会对aes(size = z)产生任何反应。这是令人困惑的,因为文档中恰好将此参数列为“可理解的”。 (2认同)
  • 我现在慢慢明白了..level..和..密度..的含义。`stat_density()`-函数以填充多边形轮廓和彩色轮廓线的方式工作。但是,动态计算的`..level..` 不在原来的取值范围内。它不反映我观察到的地下水位的流场。我的猜测:内核密度估计正如它的名字所暗示的那样(我不知道细节):它反映了点密度,而不是依赖于数据场的轮廓。在这种情况下,这不是我首先要寻找的。 (2认同)

Flo*_*ein 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)
Run Code Online (Sandbox Code Playgroud)

这导致数据帧可以在ggplot中使用,stat_contour()当在该函数的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()
)
Run Code Online (Sandbox Code Playgroud)

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