我一直在尝试用这里的代码复制这个情节
我最后的尝试让我非常接近,但我找不到合适的方法使图形看起来像我想要的。在我的数据中,z是在x和y条件下进行的模拟的数值结果,我想绘制这种关系,就像你可以简单地通过散点图那样,但是更漂亮。
我的df相当大,但它有这个方面:
- x→120 - 300 连续变量
- y→0.2 - 1.8 连续变量
- z→ 范围从-0.0001到3000的连续变量
这是我用这个代码生成的第一次尝试
levelplot(z ~ x * y,
data,
panel = panel.levelplot.points,
cex = 0.7,
col.regions = rocket(25, alpha = .8, direction = -1),
colorkey = list(at = (breaks = c(1, 20, 50, 150, 500, Inf))),
scales = list(x=list(at = c(120, 140, 160, 180, 200, 220, 240, 260, 280, 299))),
xlab = "x",
ylab = "y"
) +
layer_(panel.2dsmoother(..., n = 100))
问题是,虽然点是我的数据的公平表示,但2d层不是。我想特别强调<1和>=1之间的区别所以我的间隔从1开始,其余的是根据不同实验的z值(这个超过3000,其他只有30)的刻度
我也试图分开这两个图形,你可以看看散点图和2dSmooth面板。下面是两者的代码:
## Scatter
levelplot(z ~ x * y,
data,
panel = panel.levelplot.points,
cex = 0.7,
at = c(-Inf, 1, 30, 100, 500, Inf),
col.regions = rocket(25, alpha = .8, direction = -1),
colorkey = list(
labels = c("", "1", "30", "100", "500", "")
),
scales = list(x=list(at = c(120, 140, 160, 180, 200, 220, 240, 260, 280, 299))),
xlab = "x",
ylab = "y" )
## 2dSmooth
levelplot(z ~ x * y,
data,
panel = panel.2dsmoother,
n = 200,
cuts = 5,
col.regions = rocket(25, alpha = .8, direction = -1),
colorkey = T,
scales = list(x=list(at = c(120, 140, 160, 180, 200, 220, 240, 260, 280, 299))),
xlab = "x",
ylab = "y"
)
注意我在CUT和AT方面有麻烦。当我把AT参数传递给我的2dSmooth图时,结果是荒谬的,我不知道为什么。
然而,来自2dSmooth图的CUT结果是足够的,问题是我无法标记它们,因为我不知道函数所采取的极限。如果有一种方法可以正确地标记这个图,那就是它。否则,我需要将两者合并。
你知道我在哪里搞砸了吗?我的二维平滑图有可能和其他库一起完成吗?到目前为止,我还没有发现任何类似的levelplot()与panel.2dsmooth谢谢你的帮助
您的问题似乎与您的数据非常相关,因此在没有访问数据的情况下很难回答。但一般来说,
-
我有点惊讶,你得到一组不同的切割点与你的2dSmooth图,因为当你不指定
at
,默认值应该只取决于数据(保持不变),而不是面板功能。我不知道发生了什么事。 -
panel.2dsmoother()
基本上只是适合你的数据回归表面,默认使用loess()
。如果你的目标是消除"异常值"的影响;通过将at
值调整到拟合的表面而不是数据,您将需要在外部执行此操作。您可以模仿panel.2dsmoother()
的代码来做到这一点,例如,
n <- 100
mod <- loess(z ~ x * y, data)
xseq <- seq(120, 300, length = n)
yseq <- seq(0.2, 1.8, length = n)
grid <- expand.grid(x = xseq, y = yseq)
fit <- predict(mod, grid)
您现在可以使用
使用标准levelplot()
调用来可视化该表面(p <- levelplot(fit ~ x + y, grid))
和相应的at
值应该大致为
do.breaks(range(fit), 5)
您可以使用
获得确切的值trellis.panelArgs(p, 1)$at